IntentService

来源:互联网 发布:淘宝神评论和神回复 编辑:程序博客网 时间:2024/05/21 20:46

1,介绍

Service不是一个单独的进程 ,它和应用程序在同一个进程中。Service不是一个线程,所以应避免在Service里面进行耗时的操作。

IntentService为Service的子类,不同的是,它使用Handle、Thread使用独立的线程异步处理消息,不影响主线程。流程如下:


2,使用例子

Service:

    package com.zhf.service;            import Android.app.Service;      import android.content.Intent;      import android.os.IBinder;            public class MyService extends Service {                @Override          public void onCreate() {              super.onCreate();          }                    @Override          public void onStart(Intent intent, int startId) {              super.onStart(intent, startId);              //经测试,Service里面是不能进行耗时的操作的,必须要手动开启一个工作线程来处理耗时操作               System.out.println("onStart");              try {                  Thread.sleep(20000);              } catch (InterruptedException e) {                  e.printStackTrace();              }              System.out.println("睡眠结束");          }                    @Override          public IBinder onBind(Intent intent) {              return null;          }      }  

IntentService:

    package com.zhf.service;            import android.app.IntentService;      import android.content.Intent;            public class MyIntentService extends IntentService {                public MyIntentService() {              super("yyyyyyyyyyy");          }                @Override          protected void onHandleIntent(Intent intent) {              // 经测试,IntentService里面是可以进行耗时的操作的               //IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent               //对于异步的startService请求,IntentService会处理完成一个之后再处理第二个               System.out.println("onStart");              try {                  Thread.sleep(20000);              } catch (InterruptedException e) {                  e.printStackTrace();              }              System.out.println("睡眠结束");          }      }  
Activity:

    package com.zhf.service;            import android.app.Activity;      import android.content.Intent;      import android.os.Bundle;            public class ServiceDemoActivity extends Activity {          /** Called when the activity is first created. */          @Override          public void onCreate(Bundle savedInstanceState) {              super.onCreate(savedInstanceState);              setContentView(R.layout.main);              startService(new Intent(this,MyService.class));//主界面阻塞,最终会出现Application not responding               //连续两次启动IntentService,会发现应用程序不会阻塞,而且最重的是第二次的请求会再第一个请求结束之后运行(这个证实了IntentService采用单独的线程每次只从队列中拿出一个请求进行处理)               startService(new Intent(this,MyIntentService.class));              startService(new Intent(this,MyIntentService.class));          }      }  

3,IntentService源码分析

public abstract class IntentService extends Service {        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);                }        }
IntentService 使用了Handler
onCreate()的源码:

@Override        public void onCreate() {                super.onCreate();                HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");                thread.start();                mServiceLooper = thread.getLooper();                mServiceHandler = new ServiceHandler(mServiceLooper);        }
IntentService创建时就会创建Handler线程(HandlerThread)并且启动,然后再得到当前线程的Looper对象来初始化IntentService的mServiceLooper,接着创建mServicehandler对象.
onStart()的源码:

 @Override        public void onStart(Intent intent, int startId) {                Message msg = mServiceHandler.obtainMessage();                msg.arg1 = startId;                msg.obj = intent;                mServiceHandler.sendMessage(msg);        }

4,使用ResultReceiver与Activity通信

public class HomeActivity extends Activity implements ResultReceiver {    public void onCreate(Bundle savedInstanceState) {        ...        final Intent intent = new Intent(Intent.ACTION_SYNC, null, this, QueryService.class);        intent.putExtra("receiver", this);        intent.putExtra("command", "query");        startService(intent);    }    public void onReceiveResult(int resultCode, Bundle resultData) {        switch (resultCode) {        case RUNNING:            //show progress            break;        case FINISHED:            List results = resultData.getParcelableList("results");            // do something interesting            // hide progress            break;        case ERROR:            // handle the error;            break;    }}
//service代码:public class QueryService extends IntentService {protected void onHandleIntent(Intent intent) {        final ResultReceiver receiver = intent.getParcelableExtra("receiver");        String command = intent.getStringExtra("command");        Bundle b = new Bundle();        if(command.equals("query") {            receiver.send(STATUS_RUNNING, Bundle.EMPTY);            try {                // get some data or something                          b.putParcelableArrayList("results", results);                receiver.send(STATUS_FINISHED, b)            } catch(Exception e) {                b.putString(Intent.EXTRA_TEXT, e.toString());                receiver.send(STATUS_ERROR, b);            }            }        this.stopSelf();    }}

5,使用BroadcastReceiver与Activity通信

1),定义service

public class SimpleIntentService extends IntentService {      public static final String PARAM_IN_MSG = "imsg";      public static final String PARAM_OUT_MSG = "omsg";        public SimpleIntentService() {          super("SimpleIntentService");      }        @Override      protected void onHandleIntent(Intent intent) {            String msg = intent.getStringExtra(PARAM_IN_MSG);          SystemClock.sleep(3000); // 30 seconds          String resultTxt = msg + " "              + DateFormat.format("MM/dd/yy h:mmaa", System.currentTimeMillis());          Log.v("SimpleIntentService", "Handling msg: " + resultTxt);            Intent broadcastIntent = new Intent();          broadcastIntent.setAction(ResponseReceiver.ACTION_RESP);          broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);          broadcastIntent.putExtra(PARAM_OUT_MSG, resultTxt);          sendBroadcast(broadcastIntent);      } 

2),activity start

EditText input = (EditText) findViewById(R.id.txt_input);  String strInputMsg = input.getText().toString();  Intent msgIntent = new Intent(this, SimpleIntentService.class);  msgIntent.putExtra(SimpleIntentService.PARAM_IN_MSG, strInputMsg);  startService(msgIntent);  

3),定义receiver

public class ResponseReceiver extends BroadcastReceiver {          public static final String ACTION_RESP = "com.mamlambo.intent.action.MESSAGE_PROCESSED";          @Override          public void onReceive(Context context, Intent intent) {                           // Update UI, new "message" processed by SimpleIntentService             TextView result = (TextView) findViewById(R.id.txt_result);             String text = intent.getStringExtra(SimpleIntentService.PARAM_OUT_MSG);             result.setText(text);          }                }  
4),注册broadcastReceiver

    public void onCreate(Bundle savedInstanceState) {             super.onCreate(savedInstanceState);             setContentView(R.layout.main);                          IntentFilter filter = new IntentFilter(ResponseReceiver.ACTION_RESP);             filter.addCategory(Intent.CATEGORY_DEFAULT);             receiver = new ResponseReceiver();             registerReceiver(receiver, filter);         }  







参考:

http://android.blog.51cto.com/268543/528166/

http://www.cnblogs.com/sanxc/archive/2012/02/13/2349019.html

http://jackyrong.iteye.com/blog/1131964

0 0
原创粉丝点击