第一行代码——服务(4)服务的更多技巧

前台服务

优点:服务一直保持运行状态,不会由于系统内存不足的原因导致回收。

前台服务与普通服务的区别:前者会一致有一个正在运行的图标在系统显示栏显示。

创建一个前台服务:
注意:调用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()方法也得到执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值