前台服务
优点:服务一直保持运行状态,不会由于系统内存不足的原因导致回收。
前台服务与普通服务的区别:前者会一致有一个正在运行的图标在系统显示栏显示。
创建一个前台服务:
注意:调用startForeground()方法将MyService变成前台服务,并将通知显示出来。startForeground()方法中参数:第一个为id,第二个为Notification对象。
修改MyService中代码:
@Override
public void onCreate() {
super.onCreate();
Log.d("MyService","onCreat");
//创建一个前台服务
Intent intent = new Intent(this,MainActivity.class);
PendingIntent pi = PendingIntent.getActivity(this,0,intent,0);
Notification notification = new Notification.Builder(this)
.setContentTitle("This is content title")
.setContentText("This is content text")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher))
.setContentIntent(pi)
.build();
startForeground(1,notification);
}
运行程序,点击Strat或者Bind按钮,MyService就会以前台模式启动,并在系统状态栏显示一个通知图标。
使用IntnetService
在服务的每个具体的方法里开启一个子线程,然后在这里去处理耗时的逻辑。对此,Android专门提供了一个IntentService类,该类可创建一个异步且会自动停止的服务。
该类的用法:
1.新建一个类MyIntentService类继承自IntentService。
- 提供一个无参构造器,并在其内部调用父类的有参构造器。
- 在子类中实现onHandleIntent()抽象方法,该方法已经在子线程中运行。为了证实,我们在该方法中打印当前线程的id。
- 重写onDestroy()方法,在其中打印日志证实服务是否自动停止。
package com.example.servicetest;
import android.app.IntentService;
import android.content.Intent;
import android.support.annotation.Nullable;
import android.util.Log;
/**
* Created by lenovo on 2019/2/23.
*/
public class MyIntentService extends IntentService{
public MyIntentService(){
super("myIntentService");
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
//打印当前线程的id
Log.d("MyIntentService","Thread id is" + Thread.currentThread().getId());
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("MyIntentService","onDestry executed");
}
}
2.在activity_main.xml中添加启动MyIntentService服务的按钮。
<Button
android:id="@+id/start_intent_service"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="strat IntnetService"/>
3.在MainActivity中添加start IntentService按钮的点击事件,并打印主线程的id,用于和MyIntentService中打印的线程进行比较。
3.在AndroidManifest.xml里注册服务。
<service android:name=".MyIntentService"/>
运行程序,点击START INTENTSERVICE按钮,观察logcat中打印的日志,会发现MyIntentService和MainActivity所在的线程id不一样,而且onDestory()方法也得到执行。