服务的简单说明

一、 前台服务与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中注册服务与活动:
- android:name=".MyIntentService"
 - android:exported="false">
 - android:name=".FrontService"
 - android:enabled="true"
 - android:exported="true">
 
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;
 - }
 
Copyright © 2009-2022 www.wtcwzsj.com 青羊区广皓图文设计工作室(个体工商户) 版权所有 蜀ICP备19037934号