Activity之Service

作者: 拨云见日aaa | 来源:发表于2019-09-28 20:27 被阅读0次

    一、五种进程

    • 前台进程
    • 可视进程
    • 服务进程
    • 后台进程
    • 空进程

    (前三种进程一般不会被杀死)

    二、Service生命周期

    • 当调用startService时:
      • 先调用onCreate方法
      • 在调用onStartCommand
      • 重复调用startService方法时只调用onSatrtCommand方法
      • 调用stopService停止服务调用onDestory方法
    • 当调用bindService时:
      • 先调用onCreate方法
      • 再调用onBind方法
      • 调用unBindService停止服务调用onUnbind方法
      • 这种打开方式是随Activity的生命周期一起的

    三、用startService方法开启服务

    用startService方法打开服务时,即使关闭了app,service依旧运行

    (1)用法介绍
    • service要继承Service,然后重写onCreate、onStartCommand等方法,onBind是必须实现的方法。
    • 要在manifest文件里注册用<sevice>标签
    • 打开服务和打开Activity方式差不多,可以显示打开服务和隐式打开服务,创建Intent,然后调用startService方法即可。(注:Android5.0以后要隐式打开服务除了要set Action以外,还要setPackage)
    (2)代码示例

    MyService代码

    public class MyService extends Service {
    
        @Override
        public IBinder onBind(Intent intent) {
            Log.i("test","onBind");
            return null;
        }
        public void onCreate(){
            super.onCreate();
            Log.i("test","onCreate");
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            Log.i("test","onStartCommand");
           return super.onStartCommand(intent,flags,startId);
        }
    
        public void onDestroy(){
            super.onDestroy();
            Log.i("tset","onDestroy");
        }
    }
    

    Activity代码

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
        public void click(View view){
            Intent intent=new Intent(this,MyService.class);
            startService(intent);
        }
    }
    

    manifest注册

    <service android:name=".MyService"></service>
    
    运行结果:
    多次点击开启服务的运行效果

    四、bindService打开服务

    (1)使用介绍
    • 继承Service类,实现onBind方法
    • 再manifest文件中注册服务
    • 新建Intent,通过bindService打开服务,bindService有三个参数,intent对象,ServiceConnection对象和BIND_AUTO_CREATE
    (2)代码示例
    //Service代码和上面一样
    //注册也一样
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        public void click(View view) {
            Intent intent = new Intent(this, MyService.class);
            bindService(intent, connection, BIND_AUTO_CREATE);
        }
        ServiceConnection connection=new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
    
            }
    
            @Override
            public void onServiceDisconnected(ComponentName componentName) {
    
            }
        };
    }
    
    运行结果:
    bind Service开启服务

    五、Service和Activity之间数据交互

    (1)用法介绍
    • 用bindService方法开启服务
    • 在Service中写一个继承Ibinder的类并在onBind方法中返回
    • 在Activity中写的ServiceConnection类中就会回调,可以回去Ibinder类的引用就可以Service中的方法了
    (2)代码示例

    MyService代码

    public class MyService extends Service {
    
        @Override
        public IBinder onBind(Intent intent) {
            Log.i("test","onBind");
            return new MyBInder();
        }
        public void test(){
            Log.i("test","Activity调用我了");
        }
        class MyBInder extends Binder{
            public void binderTest(){
                test();
            }
        }
    }
    
    运行效果
    Activity调用Service方法

    六、前台服务

    前台服务就像通知一样会在前台提示用户正在运行中,像音乐播放器那样,前台服务更不容易被系统杀死

    (1)用法介绍

    它和发通知非常像,构建好Notification以后不用NotificationManager发送出去,而是调用start'Foreground
    (Android8.0以后发送通知构建通知渠道NotificationChannel)

    (2)代码示例
    import androidx.core.app.NotificationCompat;
    
    public class MyService extends Service {
    
        @Override
        public IBinder onBind(Intent intent) {
            Log.i("test","onBind");
            return new MyBInder();
        }
        public void onCreate(){
            if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O) {//但Android版本大于8.0以后构建通知渠道
                NotificationChannel channel = new NotificationChannel("1", "hello", NotificationManager.IMPORTANCE_HIGH);//第一个参数channel的id,第二个channel的名字,第三个参数channel的优先级
                NotificationManager manager=(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                manager.createNotificationChannel(channel);
            }
          NotificationCompat.Builder builder=new NotificationCompat.Builder(this,"1");//这里需要用NotificationCompat的builder
          builder.setSmallIcon(R.mipmap.hhhh);
          builder.setContentTitle("hello");
          builder.setContentText("我一直运行中");
          builder.setTicker("hello,看我,快看我");
          Notification notification= builder.build();
          startForeground(1,notification);
        }
        public void test(){
            Log.i("test","Activity调用我了");
        }
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            Log.i("test","onStartCommand");
           return super.onStartCommand(intent,flags,startId);
        }
    
        public void onDestroy(){
            super.onDestroy();
            Log.i("tset","onDestroy");
        }
        class MyBInder extends Binder{
            public void binderTest(){
                test();
            }
        }
    }
    
    运行结果
    前台服务

    七、调用系统的服务

    (1)常用的系统服务
    系统常用的服务
    (2)练习

    使用AlarmManager实现定时器的功能通过调用AlarmManager.set()功能,传三个参数进去(工作类型,定时任务触发的时间,pendingIntent对象)

    • 工作类型: 工作类型
    • 工作类型对应的触发时间: 触发时间
    • pendingIntent对象:
      pendingIntent对象有三个方法分别为getActivity,getService,getBroadcast,获取可执行的三个组件。传入四个参数,第一个context,第二个请求码,第三个intent对象,第四个flags操作标识。getBroadcast的flags常用的有以下几种状态
      • FLAG_CANCEL_CURRENT如果Alarmmanager管理的pending已经存在取消当前pendingIntent,创建新的PendingIntent
      • FLAG_UPDATE_CURRENT如果AlarmManager管理的PendingIntent对象已经存在,那么让新的pendingIntent更新前面Intent中的数据
      • FLAG_NO_CREATE如果AlarmManager管理的PendingIntent已经存在不做任何操作
      • FLAG_NO_CREATE该pendingIntent只会调用一次,调用后会自动cancel
    • 代码示例:
      Service中的代码
    public class MyService extends Service {
    
        @Override
        public IBinder onBind(Intent intent) {
            Log.i("test","onBind");
            return new MyBInder();
        }
        public void onCreate(){
        }
        public void test(){
            Log.i("test","Activity调用我了");
        }
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            Log.i("test","onStartCommand");
            AlarmManager alarmManager=(AlarmManager) getSystemService(ALARM_SERVICE);
            long time= SystemClock.elapsedRealtime()+200;
            Intent intent2=new Intent("hello");
            PendingIntent intent1=PendingIntent.getBroadcast(this,1,intent2,PendingIntent.FLAG_UPDATE_CURRENT);
            alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,time,intent1);
           return super.onStartCommand(intent,flags,startId);
        }
    
        public void onDestroy(){
            super.onDestroy();
            Log.i("tset","onDestroy");
        }
        class MyBInder extends Binder{
            public void binderTest(){
                test();
            }
        }
    }
    

    注册一个广播接收者,代码:

    //当定时器触发时调用这个广播,开启Service
    class  MyBroadcastReceiver extends BroadcastReceiver{
            public void onReceive(Context context, Intent intent){
                Intent intent1=new Intent(context,MyService.class);
                startService(intent1);
            }
        }
    

    运行结果:
    一直重复Log开始,Service你、会被一直开启


    Service重复打开

    八、IntentService

    IntentService是一个异步的可以自己关闭的Service

    (1)使用方法
    • 继承IntentService并且调用父类的有参构造函数(传自己创的IntentService的名字),然后实现onHandleIntent()方法,可以在onHandleIntent方法做一些耗时操作
    • 在manifest中注册
    • 和打开service一样在Activity中打开
    (2)代码示例

    IntentService的代码

    public class MyIntentService extends IntentService {
        public MyIntentService(){
            super("MyIntentService");
        }
        public void onHandleIntent(Intent intent){
           for(int i=0;i<10;i++){
               Log.i("test","耗时操作");
           }
        }
        public void onDestroy(){
            Log.i("test","自动停止");
        }
    }
    
    运行结果:
    执行和自动结束

    相关文章

      网友评论

        本文标题:Activity之Service

        本文链接:https://www.haomeiwen.com/subject/tspwuctx.html