android开发 关于Service的研究

两年学习android开发的时候  了解到Service的技术

一直没抽出时间整理这块内容 现在终于有时间来详细的比较深入的编码 理解这个Service了

一. Service与Activity

android开发是离不开Activity的 Activity相当于WIN的窗口

但是一般只有一个现实在前端 其他的Activity要么压到后台的栈中 要么手动销毁掉了

而Service是可以启动多个的 这样多个Service就是相当是并行状态

并且 这个Service可以和Activity保持相对独立

换句话说 可以ActivityA中启动Service

在ActivityB中给Service发消息

最后在ActivityC中关闭Service

这几个Activity轮流现实在前端

二. Service与线程

其实 理解线程的话 就很容易理解Service

Activity Service 都是在主线程中执行的 不过Activity对象是只有一个显示在前端

而Service 不显示在前端 并可以生成多个对象

这样存储在Service的数据 不会像Activity内的数据 随着Activity销毁而销毁

另外可以开启新的线程 作为后台处理线程

完全独立于Activity 只处理Activity发来的消息

三. Code

manifest中

注册2个activity 一个Service

<activity
            android:name="com.example.codetest_1.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

         <activity
            android:name="com.example.codetest_1.SecActivity">
          </activity>

		<service android:enabled="true" android:name="com.services.sev.PlayService" />

布局

activity_main 第一个activity 给三个按钮 开始Service 结束Service 和下一个界面

activity_sec 第二个activity 也给三个按钮 退出界面 发送消息2和结束Service

MainActivity的按钮处理

	public void onClick(View arg0) {
		// TODO Auto-generated method stub
        switch (arg0.getId()) {
        case (R.id.button_on):
        	//启动 Service
        	this.startService(new Intent(this, PlayService.class));
            break;
        case (R.id.button_off): {
        	//停止 Service
             this.stopService(new Intent(this,PlayService.class));
        }
            break;
        case (R.id.button_next): {
        	//打开另一个Activity
        	Intent intent = new Intent();
    		intent.setClass(MainActivity.this, SecActivity.class);
    		startActivity(intent);

        }
            break;
         default:
             break;

        }
	}

SecActivity的按钮处理

	public void onClick(View arg0) {

        switch (arg0.getId()) {
        case (R.id.button_esc):
        	//退出Activity
        	finish();
            break;
        case (R.id.button_off): {
        	//关闭Service
        	this.stopService(new Intent(this,PlayService.class));
        }
            break;
        case (R.id.button_step2): {
        	//向Service	发消息
        	Intent intent = new Intent(this, PlayService.class);
        	Bundle bundle = new Bundle();
        	bundle.putInt("op", 2);
        	intent.putExtras(bundle);  

            this.startService(intent);
       }
        break;
        default:
        	break;
        }
	}

PlayService完整代码

public class PlayService extends Service {

	private HandlerThread mHandlerThread;
	private Handler mPlayHandler;

    class PlayHandler extends Handler{
    	public PlayHandler(){

    	}

    	public PlayHandler(Looper lp){
    		super(lp);
    	} 

    	@Override
    	public void handleMessage(Message msg) {
    		// TODO Auto-generated method stub
    		super.handleMessage(msg);

    		//接收到线程处理的数据
    		// 注意 这里已经不是主线程上 而是独立的线程上
    		System.out.println("PlayHandler handleMessage");
    		System.out.println("PlayHandler thread id :"+Thread.currentThread().getId());
    	}
    }

	@Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
    	System.out.println("PlayService on onBind");
        return null;
    }

    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        Toast.makeText(this, "Play Service Created", Toast.LENGTH_SHORT).show();
        System.out.println("PlayService on onCreate");

        //启动线程
        mHandlerThread	= new HandlerThread("Play_Service_thread");
        mHandlerThread.start();
        mPlayHandler	= new PlayHandler(mHandlerThread.getLooper());
    }

    @Override
    public void onStart(Intent intent, int startId) {
        // TODO Auto-generated method stub
        super.onStart(intent, startId);

      //onStart 可以用于接收Activity发来的消息
       //注意 到这里还是处于主线程上
        Toast.makeText(this, "Play Service onStart", Toast.LENGTH_SHORT).show();

        System.out.println("PlayService on onStart");
        System.out.println("PlayService thread id :"+Thread.currentThread().getId());

        if (intent != null) {
    		Bundle bundle = intent.getExtras();
    		if (bundle != null) {
    		int op = bundle.getInt("op");
    		switch (op) {  

    		case 2:
    			//通过Message对象 转发给线程处理
    			System.out.println("PlayService on onStart  step2");
    			Message msg = mPlayHandler.obtainMessage();
    			msg.sendToTarget();
    		break;  

    			}
    		}
    	}//if
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        Toast.makeText(this, "Play Service Stopped", Toast.LENGTH_SHORT).show();

        System.out.println("PlayService on Destroy");

        //退出线程 销毁数据
        mHandlerThread.quit();
        mHandlerThread = null;
        mPlayHandler = null;
    }
}

Service的生成与销毁都可以在Activity内调用

但是Service的生命周期不等于Activity 而是在主线程 这是得注意的地方



时间: 2024-10-31 04:22:58

android开发 关于Service的研究的相关文章

Android开发实践 Service

Service是Android四大组件与Activity最相似的组件,都代表可执行的程序,区别在于Service一直在后台运行且没有用户界面. 1.Service的类图和生命周期 先来看看Service的类图: 接下来看看Service的生命周期: 2.开发Service (1)开发Service需要两步: 第1步:定义子类,继承Service 第2步:在AndroidManifest.xml文件中配置Service (2)创建Service public class MyService ext

【转】Android开发:Service和Thread的关系

不少Android初学者都可能会有这样的疑惑,Service和Thread到底有什么关系呢?什么时候应该用Service,什么时候又应该用Thread?答案可能会有点让你吃惊,因为Service和Thread之间没有任何关系! 之所以有不少人会把它们联系起来,主要就是因为Service的后台概念.Thread我们大家都知道,是用于开启一个子线程,在这里去执行一些耗时操作就不会阻塞主线程的运行.而Service我们最初理解的时候,总会觉得它是用来处理一些后台任务的,一些比较耗时的操作也可以放在这里

Android开发之低调的Service

锲而舍之,朽木不折:锲而不舍,金石可镂.--荀况 今天学习了一下Service的用法就和大家一起来讨论Android中Service的相关知识点,如有谬误,欢迎批评指正,如有疑问欢迎留言. 一.Service用途 Service在Android中和Activity是属于同一级别上的组件,Android中的Service,其意思是"服务",它在后台运行不可交互.Service自己不能运行,需要通过某一个Activity或者其它Context对象来调用,Context.startServi

Android开发之如何保证Service不被杀掉(broadcast+system/app

Android开发之如何保证Service不被杀掉(broadcast+system/app) 序言 最近项目要实现这样一个效果:运行后,要有一个service始终保持在后台运行,不管用户作出什么操作,都要保证service不被kill,这可真是一个难题.参考了现今各种定制版的系统和安全厂商牛虻软件,如何能保证自己的Service不被杀死呢? 其实除了常规的手段,我们可以参考一下微信和360,设置-程序-正在运行,可以看到微信是同时开启了两个进程和服务: [有兴趣可以研究一下 守护进程 和 AI

Android开发四大组件之Service(实例篇)

关于Service的开发详解已经在上一篇:Android开发四大组件之Service(详解篇)讲的很清楚了,本篇主要对Service的开发实例做下讲解. 程序运行效果图: 程序代码: BindService: package com.jph.servicedemo; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; /**

Android开发学习之路-该怎么学Android(Service和Activity通信为例)

在大部分地方,比如书本或者学校和培训机构,教学Android的方式都基本类似,就是告诉先上原理方法,然后对着代码讲一下. 但是,这往往不是一个很好的方法,为什么? ① 学生要掌握这个方法的用途,只能通过记忆而不是理解 ② 当某些原理稍微复杂的时候,通过讲解是不能直接理解的,有时候下课回去了再看也不一定看得明白 ③ 对英语文档不够重视,有问题先百度 本鸟自学Android一年,慢慢也学习到了很多的方法,如果你也是一个入门不久但是觉得很多东西都不明白的新手,希望本文对你有帮助. 我觉得要想学好And

Android开发-API指南-&lt;service&gt;

<service> 英文原文:http://developer.android.com/guide/topics/manifest/service-element.html 采集(更新)日期:2014-7-2 搬迁自原博客:http://blog.sina.com.cn/s/blog_48d491300100zmva.html 语法: <service android:enabled=["true" | "false"] android:expor

Android研究之英特尔 Android* 开发人员指南上的对等应用详解

简介 当没有 Wi-Fi 访问点或互联网访问时,Android* 应用可能需要对等连接在两台或多台 Android* 设备之间建立连接. 比如,文件共享应用和多人游戏. 该功能可使用 NFC.蓝牙或 Wi-Fi 对等技术来实施. 特定案例中的首选技术需要根据所需的距离.连接速度.功耗和独特的技术特性来决定. 本文将对 Wi-Fi 对等技术进行评估. Wi-Fi 对等(P2P)支持具备适当应用的 Android 4.0 或更高版本在没有接入点的情况下通过 Wi-Fi 彼此连接. Android W

第四章 Android开发三大基石—Activity、Service和Handler(1)

第四章 Android开发三大基石-Activity.Service和Handler 学习Android开发,首先就不得不学习Activity和Service这两个组件.Activity是有界面的程序,几乎承载着用户对应用程序的所有操作.而Service是没有界面的程序,它是所谓的服务,也叫后台程序.掌握好它们,是我们学习Android开发必不可少的环节.Handler是Android开发中最常用的消息机制,几乎所有应用程序都会使用Handler传递消息.可以说,想要学习Android应用开发,