学习Service

来源:互联网 发布:瑜伽教学软件 编辑:程序博客网 时间:2024/06/05 02:53
本次内容参考于《疯狂的android》第3版的个人学习笔记
———————————————————————————————————————————————————


  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。













1 0
原创粉丝点击