学习Service

本次内容参考于《疯狂的android》第3版的个人学习笔记
———————————————————————————————————————————————————
学习Service_第1张图片

  Service是Android四大组件之一(其余是Activity、BroadcastReceiver)。作用是在后台工作,比如播放着音乐时候启动小说软件,音乐仍然在播放;在后台检测网络的变化等等;总而言之,在暗地里默默付出的人。
  Service在android四大组件中是与Activity最相似的组件,他们都代表可执行的程序。
区别:
Service一直在后台运行,没有用户界面。
选择标准
如果某个程序组件需要在运行时向用户呈现某种界面,或者与用户交互,就需要用到Activity,否则使用Service了。
相似:
1、创建的步骤很像,先定义继承子类,在AndroidManifest.xml文件中配置。
2、Service也具有自己的生命周期。
3、都是从Context派生出来的,都可以调用Context.getResources()、getContentResolver()等方法。

Service的两种启动模式:startService()、bindService()
  • 通过Context的startService()来启动Service,访问者与Service之间没有关联,即使访问者退出了,Service也仍然运行。
  • 通过Context的bindService()来启动Service,访问者与Service绑定在一起,访问者一旦退出,Service也结束。

      号称前者为:持续不断,后者称为一退就断!

-------------------------------------------

      接下来是startService的启动和停止的代码,该Activity的界面中包含2个按钮,一个按钮用于启动Service,另一个用于停止Service。

Activity的代码:

public class MainActivity extends Activity implements View.OnClickListener, ServiceConnection {
 
    private Button btnStartService;
    private Button btnStoptService;//定义两个按钮

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btnStartService = (Button) findViewById(R.id.btnStartService);
        btnStoptService = (Button) findViewById(R.id.btnStoptService);//获取两个按钮

        btnStartService.setOnClickListener(this);
        btnStoptService.setOnClickListener(this);//按钮事件
    }

    @Override
    public void onClick(View v) {
 
        Intent intent = new Intent(MainActivity.this, MyService.class); //1、创建启动Service的Intent

       switch (v.getId()) {
            case R.id.btnStartService:
                startService(intent); //2、启动指定的Service
                break;
            case R.id.btnStoptService:
                stopService(intent);//3、停止指定的Service
                break;
        }
    }
}
  调用Context里的startService()、stopService()方法即可启动、停止Service,操作十分简单。而且程序使用了显式Intent来启动Service,因为从5.0开始,Google要求必须使用显式Intent启动Service组件。我个人觉得这样十分好,因为像Service这样使用频率高,而且用到的地方都是比较重要部位,这样会提高安全性吧。

接下来是通过startService()启动Service的生命周期:

context.startService() ->onCreate()  ->onStartCommand()  ->Service running

context.stopService() ->onDestroy() ->Service stop

如果Service已经运行,这是再点击启动按钮,就不会再调用onCreate() 方法,则只会调用onStartCommand()方法,而且可以执行多次.

总结得出 onCreate->onStartCommand(可以多次调用) ->onDestroy

--------------------------------

接下来是bindService()绑定本地Service,并与之通信。

当程序使用startService()来启动Service时,Service和访问者无法进行通信、交换数据。因此如果需要做以上动作,就应该使用bindService()和unbindService方法来启动、关闭Service。

Context的bindService()方法的完整方法签名为:bindService(Intent service,ServiceConnection conn,int flags)

Intent service:该参数通过Intent指定要启动的Service。

ServiceConnection conn该对象用于监听访问者与Service之间的连接情况(一般情况为this,但要实现ServiceConnection)。

int flags指定绑定时是否自动创建Service(该参数可以指定0(不自动创建)或BIND_AUTO_CREATE(自动创建))。

  当开发Service类时,该Service类必须提供一个IBinder onBind(Intent intent)方法,在绑定本地Service的情况下,onBind(Intent intent)方法所返回的IBinder对象将会传给ServiceConnection对象里onServiceConndected()方法的service参数,这样访问者就可以通过IBinder对象与Service进行通信了。

  实际上,开发通常会采用继承Binder(IBinder的实现类)的方式实现自己的IBinder对象。

  接下来在Activity中绑定本地Service:

public class MyService extends Service {

    public MyService() {
    }

    @Override
    public IBinder onBind(Intent intent) {

        System.out.println("onBind");
        return new Binder();//返回一个Binder对象
    }

    @Override
    //当启动成功后会执行的方法
    public int onStartCommand(Intent intent, int flags, int startId) {


        System.out.println("onStartCommand");
        new Thread() {
            public void run() {
                super.run();
        
                while (ture) {
                    System.out.println("服务正在运行中...");
                    try {
                        sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onCreate() {
        super.onCreate();
        System.out.println("onCreate");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        System.out.println("onDestroy");
    }

    @Override
    public boolean onUnbind(Intent intent) {
        System.out.println("onUnbind");
        return super.onUnbind(intent);
    }
}
MainActivity 的代码如下

public class MainActivity extends Activity implements View.OnClickListener, ServiceConnection {
    private Button btnStartService;
    private Button btnStoptService;
    private Button btnBindService;  //绑定服务
    private Button btnUnBindService;//解除绑定服务


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btnStartService = (Button) findViewById(R.id.btnStartService);
        btnStoptService = (Button) findViewById(R.id.btnStoptService);
        btnBindService = (Button) findViewById(R.id.btnBindService);//绑定服务
        btnUnBindService = (Button) findViewById(R.id.btnUnBindService);//解除绑定服务


        btnStartService.setOnClickListener(this);
        btnStoptService.setOnClickListener(this);
        btnBindService.setOnClickListener(this);//按钮事件
        btnUnBindService.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {

       Intent intent = new Intent(MainActivity.this, MyService.class); //指定Intent

        switch (v.getId()) {
            case R.id.btnStartService:
                startService(intent);
                break;
            case R.id.btnStoptService:
                stopService(intent);
                break;
            case R.id.btnBindService:
                bindService(intent, this, Context.BIND_AUTO_CREATE);//绑定服务
                break;
            case R.id.btnUnBindService:
                unbindService(this);//解除绑定服务
                break;
        }
    }

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {//服务被绑定成功的时候运行
        System.out.println("onServiceConnected");
    }

    @Override
    public void onServiceDisconnected(ComponentName name) { //进程被杀掉 或者 奔溃的时候运行
        System.out.println("onServiceDisconnected");
    }
使用context.bindService()启动Service的经历:
  context.bindService() -> onCreate() ->onBind()     ->Service running
  unbindService()  -> onUnbind() ->  onDestroy()      ->Service stop

总而言之,onCreate --> onBind(只一次,不可多次绑定) --> onUnbind --> onDestory。













你可能感兴趣的:(android,service)