Android入门笔记之Service和Handler

来源:互联网 发布:网络加速foss 编辑:程序博客网 时间:2024/04/29 13:18

<1>简介

Service和Handler是android重要的机制之一。

<2>关键步骤

服务一般分为两种:

1:本地服务, Local Service 用于应用程序内部。在Service可以调用Context.startService()启动,调用Context.stopService()结束。在内部可以调用Service.stopSelf() 或Service.stopSelfResult()来自己停止。无论调用了多少次startService(),都只需调用一次stopService()来停止。

2:远程服务, Remote Service 用于android系统内部的应用程序之间。可以定义接口并把接口暴露出来,以便其他应用进行操作。客户端建立到服务对象的连接,并通过那个连接来调用服务。调用Context.bindService()方法建立连接,并启动,以调用 Context.unbindService()关闭连接。多个客户端可以绑定至同一个服务。如果服务此时还没有加载,bindService()会先加载它。
提供给可被其他应用复用,比如定义一个天气预报服务,提供与其他应用调用即可。

那么先来看Service的生命周期吧:如图:

 

context.startService()->onCreate()->onStart()->Service running--调用context.stopService()->onDestroy()

context.bindService()->onCreate()->onBind()->Service running--调用>onUnbind()-> onDestroy()从上可以知道分别对应本地的以及远程的,也对应不同的方式启动这个服务。

 

 

Handler 为Android操作系统中的线程通信工具,包为android.os.Handler。

与Handler绑定的有两个队列,一个为消息队列,另一个为线程队列。Handler可以通过这两个队列来分别:

发送、接受、处理消息–消息队列;

启动、结束、休眠线程–线程队列;

Android OS中,一个进程被创建之后,主线程(可理解为当前Activity)创建一个消息队列,这个消息队列维护所有顶层应用对象(Activities, Broadcast receivers等)以及主线程创建的窗口。你可以在主线程中创建新的线程,这些新的线程都通过Handler与主线程进行通信。通信通过新线程调用 Handler的post()方法和sendMessage()方法实现,分别对应功能:

post()  将一个线程加入线程队列;

sendMessage() 发送一个消息对象到消息队列;

当然,post()方法还有一些变体,比如postDelayed()、postAtTime()分别用来延迟发送、定时发送;

消息的处理,在主线程的Handler对象中进行;具体处理过程,需要在new Handler对象时使用匿名内部类重写Handler的handleMessage(Message msg)方法;

从消息队列中获取消息。

线程加入线程队列可以在主线程中也可以在子线程中进行,但都要通过主线程的Handler对象调用post()。

 

<3>出现的问题

       不要忘记注册service。

出现问题:

ActivityManager: Unable to start service Intent{ act=com.Android.MUSIC }: not found 

解决方法:

 1.检查AndroidManifest.xml配置文件中是否配置了service

 2.检查service 是否在application标签内

 3.如果你的service和启动的activity不在同一个包内,需要把service标签中的android:name配置成service类的完全名(最好直接android:name配置成service类的完全名)。

 

<4>代码及解释

       ServiceActivity.java:

package com.service;import android.app.Activity;import android.content.ComponentName;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.Handler;import android.os.IBinder;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.widget.Toast;import com.test.R;public class ServiceActivity extends Activity{/**    * @ProjectName:  [androidtest]  * @Package:      [com.service.ServiceActivity.java]   * @ClassName:    [ServiceActivity]    * @Description:     * @Author:       [gmj]    * @CreateDate:   [2013-9-8 上午9:33:34]    * @Version:      [v1.0]  */ServiceConnection sc;OnClickListener listener;Handler hd = new Handler(){@Overridepublic void handleMessage(Message msg){switch(msg.what){case 0:Toast.makeText(ServiceActivity.this, "调用Service的onCreate和onBind方法",Toast.LENGTH_SHORT).show();break;case 1:Toast.makeText(ServiceActivity.this, "调用Service的onUnbind和onDistroy方法", Toast.LENGTH_SHORT).show();break;case 2:Toast.makeText(ServiceActivity.this, "调用Service的onDistroy方法", Toast.LENGTH_SHORT).show();break;case 3:Toast.makeText(ServiceActivity.this, "调用Service的onCreate方法",Toast.LENGTH_SHORT).show();break;}}}; public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_service);        sc=new ServiceConnection()        {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// TODO Auto-generated method stub}@Overridepublic void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stub}        };                listener=new OnClickListener()        {@Overridepublic void onClick(View v) {Intent intent=new Intent(ServiceActivity.this,myService.class);switch(v.getId()){  case R.id.serviceStart://Start Service    startService(intent);    hd.sendEmptyMessage(3);  break;  case R.id.serviceStop://Stop ServicestopService(intent);hd.sendEmptyMessage(2);      break;  case R.id.serviceBind://Bind Service    bindService(intent,sc,BIND_AUTO_CREATE);    hd.sendEmptyMessage(0);  break;  case R.id.serviceUnBind://Unbind Service    unbindService(sc);    hd.sendEmptyMessage(1);  break;}}        };                this.findViewById(R.id.serviceStart).setOnClickListener(listener);        this.findViewById(R.id.serviceStop).setOnClickListener(listener);        this.findViewById(R.id.serviceBind).setOnClickListener(listener);        this.findViewById(R.id.serviceUnBind).setOnClickListener(listener);    }}

myService.java:

package com.service;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.util.Log;public class myService extends Service{/**    * @ProjectName:  [androidtest]  * @Package:      [com.service.myService.java]   * @ClassName:    [myService]    * @Description:     * @Author:       [gmj]    * @CreateDate:   [2013-9-8 上午9:29:22]    * @Version:      [v1.0]  */@Overridepublic IBinder onBind(Intent arg0) {// TODO Auto-generated method stubreturn null;}@Overridepublic boolean onUnbind(Intent arg0){Log.d("MyService", "=========onUnbind=========");return super.onUnbind(arg0);}@Overridepublic void onRebind(Intent arg0){super.onRebind(arg0);Log.d("MyService", "=========onRebind=========");}@Overridepublic void onCreate(){super.onCreate();Log.d("MyService", "=========onCreate=========");}@Overridepublic void onDestroy(){super.onDestroy();Log.d("MyService", "=========onDestroy=========");}}


 

原创粉丝点击