[Android] Service服务详解以及如何使service服务不被杀死 (3)

这些都加入到IntentService中了,你需要做的就是实现构造方法和onHandleIntent(),如下:

public class HelloIntentService extends IntentService { /** * A constructor is required, and must call the super IntentService(String) * constructor with a name for the worker thread. */ public HelloIntentService() { super("HelloIntentService"); } /** * The IntentService calls this method from the default worker thread with * the intent that started the service. When this method returns, IntentService * stops the service, as appropriate. */ @Override protected void onHandleIntent(Intent intent) { // Normally we would do some work here, like download a file. // For our sample, we just sleep for 5 seconds. long endTime = System.currentTimeMillis() + 5*1000; while (System.currentTimeMillis() < endTime) { synchronized (this) { try { wait(endTime - System.currentTimeMillis()); } catch (Exception e) { } } } } }

如果需要重写其他回调方法,如onCreate(),onStartCommand()等,一定要调用super()方法,保证IntentService正确处理worker线程,只有onHandleIntent()和onBind()不需要这样。如:

@Override public int onStartCommand(Intent intent, int flags, int startId) { Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show(); return super.onStartCommand(intent,flags,startId); } 继承Service

继承Service就可以实现对请求多线程的处理,前面介绍了service的生命周期,可以按照生命周期实现方法。就不放示例了。

onStartCommand()的返回值
返回一个整型值,用来描述系统在杀掉服务后是否要继续启动服务,返回值有三种:

START_NOT_STICKY
系统不重新创建服务,除非有将要传递来的intent。这是最安全的选项,可以避免在不必要的时候运行服务。

START_STICKY
系统重新创建服务并且调用onStartCommand()方法,但并不会传递最后一次传递的intent,只是传递一个空的intent。除非存在将要传递来的intent,那么就会传递这些intent。这个适合播放器一类的服务,不需要执行命令,只需要独自运行,等待任务。

START_REDELIVER_INTENT
系统重新创建服务并且调用onStartCommand()方法,传递最后一次传递的intent。其余存在的需要传递的intent会按顺序传递进来。这适合像下载一样的服务,立即恢复,积极执行。

如果想从服务获得结果,可以用广播来处理

创建“绑定的”服务

用bindService()方法将应用组件绑定到服务,建立一个长时间保持的联系。

如果需要在activity或其他组件和服务交互或者通过进程间通信给其他应用程序提供本应用的功能,就需要绑定的服务。

建立一个绑定的服务需要实现onBind()方法返回一个定义了与服务通信接口的IBinder对象。其他应用程序组件可以调用bindService()方法获取接口并且调用服务上的方法。

创建一个绑定的服务,第一件事就是定义一个说明客户端与服务通信方式的接口。这个接口必须是IBinder的实现,并且必须要从onBind()方法返回。一旦客户端接收到了IBinder,就可以通过这个接口进行交互。

多个客户端可以绑定到一个服务,可以用unbindService()方法解除绑定,当没有组件绑定在服务上,这个服务就会被销毁。

//activity中 private ServiceConnection connB = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub Log.v(tag, "Service B disconnected"); } @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub Log.v(tag, "Service B connected"); MyBinderB binder = (MyBinderB) service; ServiceB SB = binder.getService(); SB.showLog(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.button1).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent a = new Intent(MainActivity.this, ServiceB.class); bindService(a, connB, BIND_AUTO_CREATE); } } //ServiceB public class ServiceB extends Service { public void showLog() { Log.i(tag, "serviceB-->showLog()"); } public class MyBinderB extends Binder { public ServiceB getService() { return ServiceB.this; } } private MyBinderB myBinderB = new MyBinderB(); @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return myBinderB; } } 启动前台服务

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zysjwx.html