全屏浏览
缩小浏览
回到页首

android基础---->IntentService的使用

  这一篇博客,我们开始前台服务与IntentServie源码分析的学习,关于service的生命周期及其简单使用,请参见我的博客:(android基础---->service的生命周期

 

目录导航:

  1.   服务的简单说明
  2.   service服务测试的准备代码
  3.   Intent服务的使用
  4.   前台服务的使用
  5.   IntentService的原理分析
  6.   友情链接

 

服务的简单说明

一、 前台服务与IntentService:

  • 前台服务可以一直保持运行状态,而不会由于系统内存不足的原因导致被回收

 

service服务测试的准备代码

我们通过一个具体的案例来说明start与bind方式的service服务的生命周期的介绍。项目结果如下:

 

一、 在MainActivity.java中做一些初始化工作,如下代码:

private final static String TAG = "MyIntentService";
private MyIntentService.MyBinder binder;

private ServiceConnection connection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        binder = (MyIntentService.MyBinder) service;
        binder.sayHello(name.getClassName());
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        Log.i(TAG, "service disconnect: " + name.getClassName());
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

 

二、 创建一个简单的IntentService服务类:MyIntentService

package com.example.linux.intentservicetest;

import android.app.IntentService;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

public class MyIntentService extends IntentService {
    private final static String TAG = "MyIntentService";
    private MyBinder myBinder = new MyBinder();

    class MyBinder extends Binder {
        public void sayHello(String name) {
            Log.i(TAG, "say hello method: " + name);
        }

        public void sayWorld(String name) {
            Log.i(TAG, "say world method: " + name);
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        return myBinder;
    }

    public MyIntentService() {
        super("MyIntentService");
        Log.i(TAG, "myintent service constructor.");
    }

    @Override
    public void onCreate() {
        Log.i(TAG, "on create.");
        super.onCreate();
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        Log.i(TAG, "handle intent: " + intent.getStringExtra("username") + ", thread: " + Thread.currentThread());
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "on destroy.");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(TAG, "on start command.");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public boolean onUnbind(Intent intent) {
        //默认返回false
        String username = intent.getStringExtra("username");
        Log.i(TAG, "on unbind: " + super.onUnbind(intent) + ", username: " + username);
        return true;
    }

    @Override
    public void onRebind(Intent intent) {
        Log.i(TAG, "on rebind");
        super.onRebind(intent);
    }
}

 

 三、 创建一个简单的前台服务类:FrontService

package com.example.linux.intentservicetest;

import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

public class FrontService extends Service {
    private final static String TAG = "MyIntentService";
    public FrontService() {
        Log.i(TAG, "front service constructor");
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Notification.Builder builder = new Notification.Builder(this);
        Intent intent = new Intent(this, MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
                PendingIntent.FLAG_CANCEL_CURRENT);

        builder.setSmallIcon(R.mipmap.ic_launcher).setTicker("ticker");
        builder.setWhen(System.currentTimeMillis()).setAutoCancel(true);
        builder.setContentTitle("content title").setContentText("content text");
        builder.setContentIntent(pendingIntent);

        Notification notify = builder.getNotification();

        notify.defaults = Notification.DEFAULT_ALL;
        startForeground(10, notify);
    }
}

 

四、 在AndroidManifest.xml中注册服务与活动:

<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<service
    android:name=".MyIntentService"
    android:exported="false">
</service>
<service
    android:name=".FrontService"
    android:enabled="true"
    android:exported="true">
</service>

 

Intent服务的使用

一、 在MainActivity中创建方法,启动停止服务:

// 开启服务
public void startService(View view) {
    Intent intent = new Intent();
    intent.putExtra("username", "linux");
    intent.setClass(MainActivity.this, MyIntentService.class);
    startService(intent);
}

// 停止服务
public void stopService(View view) {
    Intent intent = new Intent();
    intent.setClass(MainActivity.this, MyIntentService.class);
    stopService(intent);
}

 

二、 在MainActivity中创建方法,绑定解绑服务:

// 绑定服务
public void bindService(View view) {
    Intent intent = new Intent();
    intent.setClass(MainActivity.this, MyIntentService.class);
    intent.putExtra("username", "linux");
    boolean isBind = bindService(intent, connection, Context.BIND_AUTO_CREATE);
    Log.i(TAG, "bind service: " + isBind);
}

// 解绑服务
public void unbindService(View view) {
    Intent intent = new Intent();
    intent.setClass(MainActivity.this, MyIntentService.class);
    unbindService(connection);
}

 

三、 运行结果:

  • 点击start:
03-25 08:01:53.460 8389-8389/? I/MyIntentService: myintent service constructor.
03-25 08:01:53.460 8389-8389/? I/MyIntentService: on create.
03-25 08:01:53.475 8389-8389/? I/MyIntentService: on start command.
03-25 08:01:53.477 8389-8727/? I/MyIntentService: handle intent: linux, thread: Thread[IntentService[MyIntentService],5,main]
03-25 08:01:53.478 8389-8389/? I/MyIntentService: on destroy.
  • 点击stop:无输出
  • 点击bind:
03-25 08:02:25.421 8389-8389/? I/MyIntentService: bind service: true
03-25 08:02:25.422 8389-8389/? I/MyIntentService: myintent service constructor.
03-25 08:02:25.422 8389-8389/? I/MyIntentService: on create.
03-25 08:02:25.432 8389-8389/? I/MyIntentService: say hello method: com.example.linux.intentservicetest.MyIntentService
  • 点击unbind:
03-25 08:02:28.486 8389-8389/? I/MyIntentService: on unbind: false, username: linux
03-25 08:02:28.490 8389-8389/? I/MyIntentService: on destroy.

 

前台服务的使用

一、 在MainActivity中创建方法,启动前台服务:

// 前台服务的使用
public void frontService(View view) {
    Intent intent = new Intent();
    intent.setClass(MainActivity.this, FrontService.class);
    startService(intent);
}

 

二、 运行结果: 在手机的通知栏中

 

IntentService的原理分析

一、 intentService是继承Service的抽象方法:

public abstract class IntentService extends Service 

 

二、 intentService包含的一些字段引用如下:

private volatile Looper mServiceLooper;
private volatile ServiceHandler mServiceHandler;
private String mName;
private boolean mRedelivery;

private final class ServiceHandler extends Handler {
    public ServiceHandler(Looper looper) {
        super(looper);
    }

    @Override
    public void handleMessage(Message msg) {
        onHandleIntent((Intent)msg.obj);
        stopSelf(msg.arg1);
    }
}

 

二、 和service一样在启动的时候,首先是执行构造方法,接着是onCreate方法,然后是onStartCommand方法,在onStartCommand中执行了onStart方法(执行流程在android基础---->service的生命周期讲过):

  • onCreate方法,开启了一个线程,并且得到Looper与初始化了一个Handler
@Override
public void onCreate() {
    // TODO: It would be nice to have an option to hold a partial wakelock
    // during processing, and to have a static startService(Context, Intent)
    // method that would launch the service & hand off a wakelock.

    super.onCreate();
    HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
    thread.start();

    mServiceLooper = thread.getLooper();
    mServiceHandler = new ServiceHandler(mServiceLooper);
}
  • onStart方法,用上述的Handler发送信息
@Override
public void onStart(Intent intent, int startId) {
    Message msg = mServiceHandler.obtainMessage();
    msg.arg1 = startId;
    msg.obj = intent;
    mServiceHandler.sendMessage(msg);
}
  • onStartCommand方法,调用onStart方法,发送信息
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    onStart(intent, startId);
    return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}
  • 最后上述的Handler得到信息,调用handleMessage方法,其中有stopSelf(msg.arg1)方法,停止了服务:

 

三、 这里附上service类的两个方法,源代码是android6.0的

  • 在Service中的onStart方法已经被废弃了:
/**
 * @deprecated Implement {@link #onStartCommand(Intent, int, int)} instead.
*/
@Deprecated
public void onStart(Intent intent, int startId) {
}
  • 在onStartCommand的方法中
public int onStartCommand(Intent intent, int flags, int startId) {
    onStart(intent, startId);
    return mStartCompatibility ? START_STICKY_COMPATIBILITY : START_STICKY;
}

 

友情链接

 

posted @ 2016-03-25 08:17  huhx  阅读(2137)  评论(2编辑  收藏  举报