废话
今天我们来学习下关于Service的更多知识
- 前台服务
- IntentService
- 在Service中启动Activity
前台服务
Service一直都是默默在后台工作,没有Activity的风光,但能不能让Service展示出来,我们可能想知道Service在做什么,做得怎么样了,或者是想直接控制Service
Service可以展示出来,我们可以使用前台服务将Service显示在下拉的通知了上
我们平时也接触过很多前台服务了,比如天气app,音乐app在你返回桌面的时候会在通知栏显示一栏前台服务,我们可以通过点击操作播放的音乐,比如下一曲、暂停、播放等,下面我们就来看看前台服务是怎么实现的吧
我们创建一个Service,并在onCreate方法里使用前台服务
@Override
public void onCreate() {
super.onCreate();
Intent intent=new Intent(this,MainActivity.class);
PendingIntent pendingIntent=PendingIntent.getActivity(this,0,intent,0);
Notification notification=new NotificationCompat.Builder(this)
.setContentTitle("Title")
.setContentText("Content")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher))
.setContentIntent(pendingIntent)
.build();
startForeground(1,notification);
}
这样我们就创建完成了,我们启动app,通知栏就会显示我们的前台服务,点击我们就进入了MainActivity
IntentService
Service虽然是在后台执行,但它还是运行在主线程的,所以我们要进行耗时操作,还是得自己创建子线程,Android当然也考虑到了,所有给我们提供了一个IntentService,它就是运行在子线程的,运行结束后还会自己销毁掉,下面我们就来看看它是如何创建的吧
public class MyIntentService extends IntentService {
public MyIntentService(String name) {
super(name);
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
//处理事情
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
这样我们就创建完成了,我们在onHandleIntent处理相关逻辑,因为IntentService是运行在子线程的,所以不用考虑阻塞线程
启动Activity
我们一般都是在Activity中启动Activity或Service,但想一想,我们能不能在Service中启动Activity呢,当然能,启动方式和在Activity中一样,只是多了一个方法,下面我们来看看如何在Service中启动Activity
Intent intent=new Intent(this,MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
它与在Activity中启动唯一的区别在于多了一个intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
这个方法是new一个栈存放Activity,这样我们就能启动Activity了
如果我们之前就启动过MainActivity,那么此时点击任务键可以看到有两个MainActivity,这是因为这两个Activity是在不同的栈,我们想处理这种情况可以在AndroidManifest中加上android:excludeFromRecents="false"
<activity
android:name=".MainActivity"
android:excludeFromRecents="false">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
这个代码的作用就是让MainActivity不在最近任务列表中显示。
网友评论