美文网首页
Android基础知识:Service(4)更多知识

Android基础知识:Service(4)更多知识

作者: JYangkai | 来源:发表于2018-12-29 21:44 被阅读0次

    废话

    今天我们来学习下关于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不在最近任务列表中显示。

    相关文章

      网友评论

          本文标题:Android基础知识:Service(4)更多知识

          本文链接:https://www.haomeiwen.com/subject/kptbkqtx.html