Android基础(七):后台服务

Service

Service没有用户界面,系统资源要求更低

Service比Activity具有更高的优先级,在系统资源紧张时,Service不会被Android系统优先终止,即使Service被系统终止,在系统资源恢复后Service也可以自动恢复运行状态

Service除了实现后台服务功能,还可以用于进程间通信,解决不用Android应用程序进程之间的调用和通信问题。

Service使用方式

  • 启动方式
  • 绑定方式

通过调用startService()启动Service,通过调用stopService()或stopSelf()停止Service。

绑定方式通过服务链接来使用Service,服务链接能够获取Service的对象实例,因此绑定方式下可以调用Service中实现的函数,获取Service中的状态和数据信息使用Service的组件通过bindService()建立服务链接,通过unbindService()停止服务链接如果在绑定过程中Service没有启动,bindService()会自动启动Service,而且同一个Service可以绑定多个服务链接,这样可以同时为多个不同的组件提供服务

服务管理

本地服务的调用者和服务都在同一个程序中,是不需要跨进程就可以实现服务的调用

服务管理主要指服务的建立、启动和停止创建服务需要继承Service类,还需要在AndroidManifest.xml文件中进行注册。

还需要三个生命周期函数,分别是onCreate()、onStartCommand()和onDestroy()。

服务生命周期流程:

首先调用startService启动Service,再进入onCreate创建Service时会被调用,用于初始化工作。然后调用onStartCommand()启动Service时被调用,运行Service,当Service被停止时,需要关闭Service,先要调用onDestory()方法释放所占用的资源。

其中onStartCommand的四种返回值,分别是:

START_STICKY:函数执行完后,服务被异常杀掉,系统会自动重启该服务,传入的第一个参数是null。START_NOT_STICKY:函数执行完后,服务被异常杀掉,系统不会自动重启该服务。                            START_REDELIVER_INTENT:重传Intent,函数执行完后,服务被异常杀掉,系统会自动重启该服务,并传入Intent的值。START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被杀掉后一定能重启。

有两种方法启动Service,显式启动和隐式启动

显式启动需要在Intent中指明Service所在的类,并调用startService(Intent)启动Service

 

隐式启动需要在注册Service时,声明Intent-filter的action属性,还要设置Intentaction属性

 

如果Service和调用服务的组件在同一个应用程序中,可以使用显式启动或隐式启动,但如果服务和调用服务的组件在不同的应用程序中,则只能使用隐式启动,无论是显式启动还是隐式启动,停止Service的方法都是相同的,将启动ServiceIntent传递给stopService(Intent)函数

 

创建一个Service组件,代码如下

    @Override
    public IBinder onBind(Intent intent) {  //绑定方式使用服务
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public void onCreate() {    //创建服务
        super.onCreate();
        Toast.makeText(this,"onCreate",Toast.LENGTH_SHORT).show();    //显示消息
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(this,"onStartCommand",Toast.LENGTH_SHORT).show();
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(this,"onDestroy",Toast.LENGTH_SHORT).show();
    }
在MainActivity中创建一个新的Intent:
final Intent intent = new Intent(MainActivity.this,MyService.class); //显示启动
在按钮一监听器中调用开启服务startService(intent);	
在按钮二监听器中调用 stopService(intent);结束服务
final Intent intent = new Intent("www.com.service");       //隐式启动
intent.setPackage("com.example.myapplication01");          //设置包名

隐式启动需要在AndroidManifest中注册service,


    	//名称需要一致

服务绑定

以绑定方式使用Service,能够获取Service实例,不仅能够正常启动Servie,还能调用Service中的方法与属性。

为了使用Service支持绑定,需要在Service类中重写onBind()方法,并在onBind()方法中返回Service的实例。

绑定方式中,当调用者通过bindService()绑定Service时,onCreate()和onBind()先后被调用当调用者通过unbindService()取消绑定Servcie时,onUnbind()被调用。如果onUnbind()返回true,则表示重新绑定服务时,onRebind()将被调用。

通过bindService()绑定服务

final Intent serIntent = new Intent(this,MyService.class);
bindService(serIntent,mConnection,BIND_AUTO);

第1个参数中将Intent传递给bindService()函数,声明需要启动的Service第3个参数BIND_AUTO_CREATE表明只要绑定存在,就自动建立Service,同时也告知Android系统,这个Service的重要程度与调用者相同,除非考虑终止调用者,否则不要关闭这个Service。

第2个参数是ServiceConnnection,由调用者声明,并重写内部的onServiceConnected()方法和onServiceDisconnected()方法绑定成功,系统调用onServiceConnected()方法绑定意外断开,系统调用onServiceDisconnected()方法

使用unbindService()方法进行取消绑定,并将ServiceConnnection传递给unbindService()方法

    private MyService myService = null; //创建服务对线
    private boolean isBind = false;     //标记绑定状态
    private static TextView textView;

    private ServiceConnection myConnection = new ServiceConnection() {  //服务连接
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            myService =  ((MyService.LocalBinder) service).getService();    //获取服务实例
            isBind = true;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            isBind = false;
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.ResultTextView);
        final Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                bindService(intent,myConnection,BIND_AUTO_CREATE);//绑定服务
            }
        });
        final Button StopButton = findViewById(R.id.StopServiceBTN);    //解除绑定

        StopButton.setOnClickListener(new View.OnClickListener() {    
            @Override
            public void onClick(View v) {       
               stopService(intent);
               if (isBind){
                   unbindService(myConnection);    //接触绑定的链接
                   isBind = false;
               }
            }
        });
        final Button AddButton = findViewById(R.id.AddBtn);
        AddButton.setOnClickListener(new View.OnClickListener(){    
            @Override                                         //使用加减操作查看服务状态
            public void onClick(View v) {
                if(isBind){
                    long a = Math.round(Math.random()*100);
                    long b = Math.round(Math.random()*100);
                    long r = myService.Add(a,b);
                    textView.setText(a +"+"+ b + "=" + r);
                }else {
                    textView.setText("unbind");
                }
            }
        });
    }

你可能感兴趣的:(Android,Java)