[关闭]
@universal 2018-10-09T08:36:45.000000Z 字数 3353 阅读 386

Service的入门讲解

简介:Service作为Android四大组件之一,与Activity的地位是并列的,不同的是Service主要位于后台执行长时间的操作,(ep:一个Service可以在后台执行网络请求、播放音乐、执行文件读写操作)一般不需要与用户交互,也就不用依赖于UI界面。However,Service一旦启动也就具有了生命周期,用法和Activity类似。

---注意:Service和线程是两个不同的概念。Servie是系统的组件,而Thread是程序执行的最小单元。而且Service是运行在主线程里的,所以为了不出现ANR可以在服务里创建一个线程来处理复杂耗时的任务。在服务里创建线程是为了方便控制。

Service的创建、注册

  1. public class MyService extends Service {
  2. public static final String TAG = "MyService";
  3. @Override
  4. public void onCreate() {
  5. super.onCreate();
  6. Log.d(TAG, "onCreate()");
  7. }
  8. @Override
  9. public int onStartCommand(Intent intent, int flags, int startId){
  10. Log.d(TAG, "onStartCommand()");
  11. return super.onStartCommand(intent, flags, startId);
  12. }
  13. @Override
  14. public void onDestroy() {
  15. super.onDestroy();
  16. Log.d(TAG, "onDestroy() ");
  17. }
  18. @Override
  19. public IBinder onBind(Intent intent) {
  20. return null;
  21. }
  22. }

Service的生命周期

  1. public class MainActivity extends AppCompatActivity {
  2. private Button button1;
  3. private Button button2;
  4. @Override
  5. protected void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.activity_main);
  8. button1= (Button) findViewById(R.id.b_start);
  9. button2= (Button) findViewById(R.id.b_stop);
  10. button1.setOnClickListener(new View.OnClickListener() {
  11. @Override
  12. public void onClick(View v) {
  13. Intent intent=new Intent(MainActivity.this,MyService.class);
  14. startService(intent);
  15. }
  16. });
  17. button2.setOnClickListener(new View.OnClickListener() {
  18. @Override
  19. public void onClick(View v) {
  20. Intent intent=new Intent(MainActivity.this,MyService.class);
  21. stopService(intent);
  22. }
  23. });
  24. }
  25. }

注意: startService()启动Service之后,再bindService()绑定,此时只会回调onBind()方法;若想回调Service的destory()方法,需要同时调用 stopService()和 unbindService()方法才能让服务销毁掉。

活动与服务

活动与服务间的通信是通过bindservice(Intent service,ServiceConnection coon,int flags)来实现的,首先我们得创建一个匿名类获取到ServiceConnection,然后重写里面的onServiceConnected()方法和onServiceDisconnected()方法,可以处理活动与服务成功绑定时的任务。比如我们可以得到服务里Binder的实例,通过这个实例,就可以在activity中去控制服务。
/Mainactivity/

private ServiceConnection serviceConnection=new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder ibinder) {
        mybinder= (MyService.mybinder) ibinder;
        mybinder.pr();
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {

    }
};
    ....//其他操作
    button3.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent=new Intent(MainActivity.this,MyService.class);
            bindService(intent,serviceConnection,BIND_AUTO_CREATE);

        }
    });
    button4.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            unbindService(serviceConnection);
        }
    });

/MyService/

private mybinder mybinder=new mybinder();
class mybinder extends Binder{
    public void pr(){
        Log.d(TAG,"onBind()");
    }
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return mybinder;
}
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注