Android基础----Service

来源:互联网 发布:c语言预处理指令放在哪 编辑:程序博客网 时间:2024/05/20 22:26

简介:

Service是和Activity相类似的应用组件,他们都是一个可以自行的程序,最大的区别就在于Activity是有界面显示的,而Service是不需要界面显示的,其是运行在后台的服务。所以Service常用于处理不需要交互界面的一些任务,例如后台播放器播音乐等任务。

基本用法:

  1. 实现一个自定义的Service类,继承自系统的Service类,并实现其中的方法

  2. 在AndroidManifest.xml文件中注册自定义的Service

  3. 通过两种方式来启动Service

由于Service有着两种不同的启动方式,随着启动方式的不同,其生命周期和使用特性也有所不一样,所以我们分别来看这两种启动方式的Service。

通过startService()启动Service

1. 自定义一个Service类,并实现其中需要的的方法

public class MyService extends Service {    //在Service创建时调用    @Override    public void onCreate() {        super.onCreate();    }    //使用stratService()启动时调用    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        return super.onStartCommand(intent, flags, startId);    }    //销毁时调用    @Override    public void onDestroy() {        super.onDestroy();    }    //在startService()这种启动方式中没有用    @Nullable    @Override    public IBinder onBind(Intent intent) {        return null;    }}

2. 在AndroidManifest.xml文件中注册Service

<!----注册一个Service><service android:name=".MyService">    <!----配置相应的intent过滤器>    <intent-filter >        <action android:name="com.wei.review_service.START_SERVICE" />    </intent-filter>

3. 通过startService()来启动

//声明intentIntent intent = new Intent();//为intent指定actionintent.setAction("com.wei.review_service.START_SERVICE");//启动ServicestartService(intent);//停止ServicestopService(intent);

通过bindService()启动Service

1. 自定义一个Service,并实现其中的方法

public class MyService extends Service {    private int count;    private MyBinder binder = new MyBinder();    //当Service创建时调用    @Override    public void onCreate() {        super.onCreate();    }    //当Service被绑定时调用(必须实现)    @Nullable    @Override    public IBinder onBind(Intent intent) {        return binder;    }    //当Service解除绑定时调用    @Override    public boolean onUnbind(Intent intent) {        return super.onUnbind(intent);    }    //当Service销毁时调用    @Override    public void onDestroy() {        super.onDestroy();    }    /**     * 通过继承Binder类来实现IBinder     */    public class MyBinder extends Binder{        public int getCount(){            return count;        }    }}

2. 在AndroidManifest.xml文件中注册Service

<service android:name=".MyService">    <intent-filter >        <action android:name="com.wei.review_service.START_SERVICE" />    </intent-filter></service>

通过bindService()方法来启动Service

    //声明一个Binder引用    MyService.MyBinder myBinder;    //声明一个ServiceConnection实例    ServiceConnection serviceConnection = new ServiceConnection() {        //当Service被绑定时调用,并返回Service中的Binder实例        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            myBinder = (MyService.MyBinder) service;        }        //当Service解除绑定时调用        @Override        public void onServiceDisconnected(ComponentName name) {            //实现当service断开连接时需要处理的业务        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //绑定Service        bindService(new Intent("com.wei.review_service.START_SERVICE"), serviceConnection, BIND_AUTO_CREATE);        //解除绑定        unbindService(serviceConnection);    }

两种启动方式的异同:

通过startService()来启动Service,Service和启动它的Activity之间没有关联,只有当调用stopService()或者是被系统清理掉时才会停止,不会因为Activity的退出而结束生命周期。缺点是无法和Service进行交互,当启动一个Service后就只能让Service自己运行。

通过bindService()方法启动Service,其生命周期是和启动它的Activity绑定在一起的,当Activity退出时Service也会自动的结束生命周期。优点是可以通过Binder来实现和Service的交互,可以控制Service的运行情况。

两中启动方式的生命周期图:

生命周期

两种启动方式混合使用:

之前被人问到说要是两种启动方式混合使用Service生命周期怎么表示,当是简直是一脸懵逼。。

同时使用两种方式来启动同一个Service,我们可以分情况来看一下:

  • 首先不论启动多少次Service,其都只会调用一次onCreate方法,在调用完onCreate方法之后就需要分情况来讨论:

  • 若是先startService,再bindService

    • 首先调用onCreate,然后是onStartCommand ,在点击bindService之后会调用onBind()。
    • 若是要停止Service时,先点击stopService已经没有效果了,无法停止Service,要先unbindService,然后会调用unbind方法,最后onDestyoy
  • 若是先bindService,然后在startService

    • 首先调用onCreate,然后是onBind,在点击startService之后调用onStartCommand 。
    • 若是要停止Service时,同样的stopService无法起作用,要先unbindService之后,才会调用onUnBind和onDestroy

结论:

在启动时: Service的onCreate方法只会执行一次,只要service已经启动了,那么就不会再次执行onCreate方法,两种启动方式会调用其专有的生命周期函数。

在停止时: 无论两种启动方式谁先谁后,只要service被bind过,那么在结束时就需要先把service解除绑定,完了之后才会调用结束的方法。


IntentService:

因为Service并不是一条专门的线程,而且他还和他所在的应用在同一进程内,所以不宜在Service中做太多耗时的任务,会阻塞主线程,容易引起ANR(若Service在20s内无反应就会报ANR)。IntentService是Service的一个子类,其被设计用于处理这些问题。

IntentService会单独的创建worker线程来处理所有的Intent请求,而且会创建单独的worker线程来处理onHandleIntent()方法实现的代码,在处理完成请求之后会自动停止,同时对onBind()和onStartCommand()方法提供了默认实现,,只需要实现其处理业务的onHandleIntent()方法即可。

public class MyIntentService extends IntentService {    /**     * Creates an IntentService.  Invoked by your subclass's constructor.     *     * @param name Used to name the worker thread, important only for debugging.     */    public MyIntentService(String name) {        super(name);    }    @Override    protected void onHandleIntent(Intent intent) {        //实现需要处理的业务,IntentService已经完成了对于多线程的支持,所以不会阻塞主线程    }}

系统中的Service:

我们可以通过getSystemService()在Activity中获取有用的系统服务。

1. TelephonyManager:

电话管理器可以用于管理手机通话状态,电话网络信息的服务类。他提供了众多的方法可以对手机的状态进行查看。

TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

2. SmsManager:

短信管理器可以用于管理短信的发送和接收。

SmsManager smsManager = SmsManager.getDefault();

3. AudioManager:

音频管理器可以用于处理系统的音量等事物。

AudioManager audioManager = (AudioManager) getSystemService(Service.AUDIO_SERVICE);

4. Vibrator:

振动器管理器可以管理手机振动的相关功能,实现对振动器的处理。

Vibrator vibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);

5. AlarmManager:

闹钟管理器可以管理手机的闹钟服务,或者是一个全局的定时器。

AlarmManager alarmManager = (AlarmManager) getSystemService(Service.ALARM_SERVICE);
0 0
原创粉丝点击