美文网首页
Android-服务的基本用法(二)

Android-服务的基本用法(二)

作者: 见哥哥长高了 | 来源:发表于2019-08-13 11:59 被阅读0次
使用前台服务

对于系统而言,服务的优先级还是比较低的,服务几乎都是在后台运行的。所以,如果内存警告的话,系统会去回收服务的这部分内存,终止服务的执行。有时候我们希望服务能够一直保持一个运行的状态,这个时候就可以考虑使用前台服务。
怎样才能创建一个前台服务呢?其实很简单。
我们需要在MyService的onCreate() 方法中:

    //服务在创建的时候调用的方法
    @Override
    public void onCreate() {

        Log.d("MyService","onCreate()-------");

        super.onCreate();

        Intent intent = new Intent(this,MainActivity.class);

        PendingIntent pendingIntent = PendingIntent.getActivity(this,0,intent,0);

        Notification notification =new NotificationCompat.Builder(this,"channelId")
                .setContentTitle("哈哈")
                .setContentText("内容")
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.mipmap.ic_launcher)
                .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher_round))
                .setContentIntent(pendingIntent)
                .build();
        startForeground(1,notification);
    }

在这里我们构建了Notification之后,调用startForeground()方法让MyService成为了一个前台服务。方法中第一个参数是Notification的id,第二个参数是我们构建的Notification对象。这个时候运行程序,启动MyService,MyserVice就作为一个前台服务运行了,我们可以在通知栏或者状态栏查看。

IntentService

通过前面我们对服务的了解,服务大多都是在主线程执行的,但是往往一些复杂的业务逻辑又不能直接在主线程中执行。这个是后续就需要开启子线程来实现操作。

    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("MyService","onStartCommand()-------");
        new Thread(new Runnable() {
            @Override
            public void run() {
            //执行复杂的逻辑
            }
        });
        return super.onStartCommand(intent, flags, startId);
    }

知道这种服务一旦启动就会处于运行状态,必须调用stopSelf()或者stopService()才能让其停下来。如果要让一个服务在执行完毕之后自动停下来 可以执行如下操作。

 public void run() {
       stopSelf();
 }

为了可以简单的创建一个异步的 能够自动停止的服务 Android专门有一个类IntentService。IntentService类就很好的解决了上述两种问题。
那么怎么使用IntentService呢?
1、创建一个类MyIntentService继承自IntentService
2、在MyIntentService内实现如下方法

public class MyIntentService extends IntentService {

    public MyIntentService(){

        super("MyIntentService");//调用父类的有参构造方法
    }

    //onHandleIntent抽想方法 可以处理一些具体的逻辑 这个方法默认的是在子线程中执行
    //这个方法在运行完成之后是自动停止的
    @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","onDestroy() run");

    }
}

上述方法中并没有特别的逻辑代码,方便测试,我们只是打印了一下当前服务运行的线程id。倘若线程销毁的话必定会调用onDestroy() 方法,打印日志。
接下来我们在MainActivity中实现点击一个按钮来启用IntentService

        intent_servece.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Log.d("MainActivity","Threa is "+ Thread.currentThread().getId());

                Intent intent = new Intent(MainActivity.this, MyIntentService.class);

                startService(intent);

            }
        });

另外需要注意一点IntentService的注册是普通的Service一样。需要在AndroidMinafest.xml中注册。


程序运行日志输出

运行程序之后我们可以看到上面所示的打印结果。由此验证了我们前面所说的:IntentService能创建一个异步的 能够自动停止的服务。

相关文章

  • Android-服务的基本用法(二)

    使用前台服务 对于系统而言,服务的优先级还是比较低的,服务几乎都是在后台运行的。所以,如果内存警告的话,系统会去回...

  • Android-服务的基本用法(一)

    服务作为安卓开发的四大组件之一,发挥着非常重要的作用,下面我们以一些简单实例,总结一下服务的基本用法。 定义一个服...

  • 第一行代码读书笔记 10 -- 探究服务(中)

    本篇文章主要介绍以下几个知识点:服务的基本用法服务的生命周期服务的其他用法 10.2 服务的基本用法 服务(Ser...

  • 服务的基本用法

    服务(Service)是 Android 中实现程序后台运行的解决方案,它非常适合用于去执行那些不需要和用户交互而...

  • 9,LVS

    【安装】 【用法】 基本用法如下,分别用于设置虚拟服务算法和后端真实服务器 ipvsadm 选项 服务...

  • Node.js_http服务(二)

    Node.js_http服务(二) 一、http基本用法 加载内置的http模块var http = requir...

  • Android学习(四)—— 四大组件之Service

    本文目录结构:一、服务简介二、多线程编程三、服务的生命周期四、服务的基本用法五、前台服务六、如何保证service...

  • 内置模块【一】_md5

    一、基本使用 二、高级用法...

  • 安卓四大组件之Service

    服务介绍 服务类型 服务基本用法 服务生命周期 服务更多技巧 服务介绍服务是Android中实现程序后台运行的解决...

  • Android Service服务的基本用法

    前言:说白了,其实就3步走。1、创建service(和Activity绑定启动时,需要创建Binder内部类);2...

网友评论

      本文标题:Android-服务的基本用法(二)

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