IntentService

本文深入探讨了Android应用中的Service与IntentService的区别、使用方法及源码解析,包括Service的生命周期、如何避免耗时操作,以及IntentService如何通过独立线程处理异步任务。同时,展示了如何使用ResultReceiver与Activity通信以及BroadcastReceiver与Activity通信的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值