Android Service(服务)
Posted 穷少年
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Service(服务)相关的知识,希望对你有一定的参考价值。
文章目录
参考文章
android Service 启动方式
android有两种服务启动模式,startService 和 bindService
startService 和 bindService 区别
模式名称 | 特点 |
---|---|
startService | 一旦服务开启跟调用者(开启者)就没有任何关系了。开启者退出了,开启者挂了,服务还在后台长期的运行,只有通过调用停止服务的方法才能停止服务,或者是整个程序被kill掉,那么服务也会随之kill。开启者不能调用服务里面的方法 |
bindService | bind的方式开启服务,绑定服务,调用者挂了,服务也会跟着挂掉。绑定者可以调用服务里面的方法。(说白了就和小程序一样,打开的时候使用,用完了就关闭拍屁股走人,一次性滴)注意:绑定服务不会调用onstart()或者onstartcommand()方法 |
Service的创建以及在AndroidManifest.xml文件中的声明
我们通过android studio创建service的时候,编译器自动的帮助我们在清单文件中声明了相关属性
<service
android:name=".StartService"
android:enabled="true"
android:exported="true"></service>
- android:name:对应Service类名
- android:exported:代表是否能被其他应用隐式调用,其默认值是由service中有无intent-filter决定的,如果有intent-filter,默认值为true,否则为false。为false的情况下,即使有intent-filter匹配,也无法打开,即无法被其他应用隐式调用。
- android:enabled:是否可以被系统实例化,默认为 true因为父标签 也有 enable 属性,所以必须两个都为默认值true的情况下服务才会被激活,否则不会激活。
startService生命周期
- startService(Intent)通过这种方式开启的服务,执行的生命周期方法:第一次调用startService的时候:onCreate→onStartCommand再次调用startService的时候:只执行onStartCommand
- 想停止用startService开启的服务要使用stopService(Intent),stopService执行之后,Service会走onDestroy()方法,执行之后Service销毁,再次调用stopService没有反应
- 如果在Activity中通过startService方法开启一个服务,当Activity退出的时候Service不会销毁,依然在后台运行,只有手动调用stopService或者在应用管理器中关闭Service,服务才会销毁
startService案例
设计一个界面,上面有两个按钮,分别是启动按钮与停止按钮,用来启动、停止服务
创建一个service
public class StartService extends Service {
// 声明一个线程
private Thread myThread;
// 控制线程的运行
private boolean flag=true;
// 判断当前service内的线程是否在运行
private boolean trigger=false;
public StartService() {
}
/**
* 绑定服务时才会调用
* 必须要实现的方法
* @param intent
* @return
*/
@Override
public IBinder onBind(Intent intent) {
Log.w("StartService", "onBind()");
return null;
}
/**
* 首次创建服务时,系统将调用此方法来执行一次性设置程序(在调用 onStartCommand() 或 onBind() 之前)。
* 如果服务已在运行,则不会调用此方法。该方法只被调用一次
*/
@Override
public void onCreate() {
super.onCreate();
// 在服务创建时,实例化一个线程
myThread=new Thread(new Runnable() {
@Override
public void run() {
while(flag){
try {
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Log.w(format.format(new Date(System.currentTimeMillis())), "服务正在运行。。。。");
Thread.sleep(1000);
}catch(Exception e){
e.printStackTrace();
}
}
}
});
Log.w("StartService", "服务被创建了");
}
/**
* 每次通过startService()方法启动Service时都会被回调。
* @param intent
* @param flags
* @param startId
* @return
*/
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.w("StartService", "服务onStartCommand()被调用了");
// 在onStartCommand触发时启动线程,如果线程已经启动就无须再次启动
if(!trigger){
myThread.start();
trigger=true;
}
return super.onStartCommand(intent, flags, startId);
}
/**
* 调用stopService()停止服务销毁时的回调
*/
@Override
public void onDestroy() {
// 在service销毁时结束进程
// 将进程的运行标志设为false
flag=false;
trigger=false;
Log.w("StartService", "服务被销毁了");
super.onDestroy();
}
}
MainActivity
public class MainActivity extends AppCompatActivity {
private Button startBtn;
private Button stopBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startBtn = this.findViewById(R.id.startBtn);
stopBtn = this.findViewById(R.id.stopBtn);
// 创建服务实例
final Intent service = new Intent(this, StartService.class);
startBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 启动服务
MainActivity.this.startService(service);
}
});
stopBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 停止服务
MainActivity.this.stopService(service);
}
});
}
}
点击启动服务时,启动服务的activity进入了后台,服务并不会结束
结束服务只有kill当前程序或者调用stopService方法来结束service
以上是关于Android Service(服务)的主要内容,如果未能解决你的问题,请参考以下文章
在 android 首选项片段中使用 startService()
What's the difference between @Component, @Repository & @Service annotations in Spring?(代码片段