本篇主要讲述StartedService
1.使用方法
1>Service的生命周期
通过上图可以发现,Service的生命周期及具体方法比Activity少很多,Service的主要核心逻辑都是写在onStartCommand()方法中,
2>通过下面Demo我们来一起学习Service
上图可以看到我用startService方法开启了一个service,具体操作如下
首先,新建一个类继承Service,在这直接上源码
(源码主要涉及生命周期和数值传递)
public class MyService extends 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();
Log.e("TAG", "My Service Create!");
}
//在这里面写方法的核心任务
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e("TAG", "传递的数据 ====== "+intent.getStringExtra("msg"));
for (int i = 0; i < 50; i++) {
System.out.println("onStartCommand"+i);
if(i == 30) {
this.stopSelf();
break;
}
}
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.e("TAG", "My Service Destroys");
}
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void start(View view) {
Intent intent = new Intent(this,MyService.class);
intent.putExtra("msg","哈哈哈哈哈哈MyService");
startService(intent);
Toast.makeText(this, "Service已开启", Toast.LENGTH_SHORT).show();
}
public void stop(View view) {
Intent intent = new Intent(this,MyService.class);
stopService(intent);
Toast.makeText(this, "service已停止", Toast.LENGTH_SHORT).show();
}
}
布局文件就两个按钮,就不多说了
通过运行上面的程序,我们来看一下Service的详细信息
这是LogCat的日志:
(1)可以发现先执行onCreate在执行onStartCommand方法,然后打印数值
(2)可以发现Sercice的当前运行线程是main主线程
E/TAG: My Service Create!
E/TAG: 传递的数据 ====== 哈哈哈哈哈哈MyService
I/System.out: onStartCommand0main
I/System.out: onStartCommand1main
I/System.out: onStartCommand2main
在service创建成功后,再点击按钮StartService会发现OnCreate方法不再执行
1.oncreate 服务只会有一个实例,如果没被停止,只会创建一次
2.当执行一个已经启动的服务后,会调用onstartcommand()方法来执行业务
3.默认情况下服务于主线程在同一个线程中执行,如果在service中执行耗时操作必须在子线程操作
4.使用startservice()启动的服务在没关闭之前会一直在后台运行
【这个整数是一个描述了在系统的杀死事件中,系统应该如何继续这个服务的值】
这个返回值一共有四种常量
START_NOT_STICKY
如果系统在onStartCommand()方法返回之后杀死这个服务,那么直到接受到新的Intent对象,这个服务才会被重新创建。这是最安全的选项,用来避免在不需要的时候运行你的服务
START_STICKY
如果系统在onStartCommand()返回后杀死了这个服务,系统就会重新创建这个服务并且调用onStartCommand()方法,但是它不会重新传递最后的Intent对象,系统会用一个null的Intent对象来调用onStartCommand()方法,在这个情况下,除非有一些被发送的Intent对象在等待启动服务。这适用于不执行命令的媒体播放器(或类似的服务),它只是无限期的运行着并等待工作的到来。
START_REDELIVER_INTENT
如果系统在onStartCommand()方法返回后,系统就会重新创建了这个服务,并且用发送给这个服务的最后的Intent对象调用了onStartCommand()方法。任意等待中的Intent对象会依次被发送。这适用于那些应该立即恢复正在执行的工作的服务,如下载文件。