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