• Android之Service组件


    一、定义

      可长时间在后台运行并进行操作,是个没有界面的组件,可以被其他组件绑定,在进程间通信。

    二、创建

      1、定义类继承Service
    1 public class ExampleService extends Service {
    2     @Override
    3     public IBinder onBind(Intent intent) {
    4         // TODO Auto-generated method stub
    5         return null;
    6     }
    7 }

      2、清单文件中配置

    1 <service android:name="com.example.service.ExampleService"></service>

    三、服务的启动与停止

      在其他组件调用startService()方法启动service
      在其他组件调用stopService()方法停止service
      stopSelf()//若调用此方法停止服务,无论其他执行是否结束,都会立即停止
      stopSelf(startId)//若调用此方法停止服务,等到所有其他执行都结束才会停止服务

    四、耗时操作

      若要在服务中进行耗时操作,需要开启新的线程,因为service本身是在主线程中运行
      若希望服务长期运行,内存不足的时候也不会被杀,可设置为前台进行服务startForeground()

    五、生命周期    

     1        /**
     2      * 服务一旦创建,就不会被重复创建
     3      * 此方法只会执行一次,若服务已开启,这个方法就不会再去执行
     4      */
     5     @Override
     6     public void onCreate() {
     7         // TODO Auto-generated method stub
     8         super.onCreate();
     9     }
    10     /**
    11      * 服务在停止的时候会调用这个方法
    12      */
    13     @Override
    14     public void onDestroy() {
    15         // TODO Auto-generated method stub
    16         super.onDestroy();
    17     }
    18     /**
    19      * 每一次开启服务的时候调用
    20      */
    21     @Override
    22     public int onStartCommand(Intent intent, int flags, int startId) {
    23         // TODO Auto-generated method stub
    24         return super.onStartCommand(intent, flags, startId);
    25     }
    26     /**
    27      * 每一次开启服务的时候掉用,但此方法已被废弃
    28      */
    29     @Override
    30     public void onStart(Intent intent, int startId) {
    31         // TODO Auto-generated method stub
    32         super.onStart(intent, startId);
    33     }

      若是希望一开机便启动服务,需要通过广播接收者BootReceiver    

    1 public class BootReceiver extends BroadcastReceiver {
    2 
    3     @Override
    4     public void onReceive(Context context, Intent intent) {
    5         // TODO Auto-generated method stub
    6         Intent i=new Intent(context,ExampleService.class);
    7         context.startService(i);
    8     }
    9 }

      清单文件中配置属性及权限 

    1 <receiver android:name="com.example.service.BootReceiver">
    2          <intent-filter >
    3                 <action android:name="android.intent.action.BOOT_COMPLETED"/>
    4          </intent-filter>
    5 </receiver>
    1 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

    六、服务开启的两种方式

      1、startService():服务一旦开启就与开启者(Activity)没什么关系了,Activity挂掉了,服务还是会在后台运行。

      2、bindService():服务与Activity有关系,Activity挂掉,服务也会挂掉(不求同时生,但求同时死);但是服务挂掉,Activity不会挂掉。服务只能被显示的解除绑定一次,多次的解除绑定服务 应用程序会报异常

    七、绑定服务

      1、绑定服务调用服务里面方法的流程:

      2、在activity 采用bindService方式开启服务...

      3、写一个实现类 MyConn implements ServiceConnection

      4、接口里面有一个方法onServiceConnected 在服务成功绑定的时候调用的方法

      5、在service代码 实现 onBind方法  返回一个IBinder接口的实现( 里面必须一个调用服务方法的api)

      6、在服务成功绑定的时候 服务里面返回的IBinder对象会传给 activity里面onServiceConnected 方法

      7、获取IBinder对象 中间人, 调用中间人的方法. 间接调用了服务里面的方法

  • 相关阅读:
    Transformer详解
    PAT 1012
    PAT 1011
    PAT 1010
    Jordan Lecture Note-3: 梯度投影法
    PAT 1009
    PAT 1008
    Jordan Lecture Note-2: Maximal Margin Classifier
    PAT 1007
    PAT 1006
  • 原文地址:https://www.cnblogs.com/myxiaoQ/p/3649980.html
Copyright © 2020-2023  润新知