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
- IntentService
- IntentService
- intentservice
- IntentService
- IntentService
- IntentService
- IntentService
- IntentService
- IntentService
- IntentService
- IntentService
- IntentService
- IntentService
- IntentService
- IntentService
- IntentService
- IntentService
- intentservice
- Html.Action、html.ActionLink与Url.Action的区别
- 使用Python实现Hadoop MapReduce程序
- java之&&与& ||与| 的区别
- CCS+C6678LE开发记录08:以太网接口测试示例之代码研究
- “Ceph浅析”系列之六——Ceph与OpenStack
- IntentService
- 在tableViewTable中创建tableCell,不同分区含有不同数量的Cell
- 云计算仿真软件Cloudsim的使用(2)
- HDU2178 猜数字【水题】【推理】
- 【转载】Java面试题集(1-50)
- 100的阶乘末尾有多少个0的问题
- HTML5 Canvas 绘图入门
- android 按钮的点击缩放
- 项目部署问题总结