首页 > 其他分享 >Android中的intentservice

Android中的intentservice

时间:2022-12-05 13:02:13浏览次数:48  
标签:String intentservice SimpleIntentService Intent result input Android public


在Android的应用中,往往需要在执行主界面的操作时,如果要执行耗时的操作,那么应该是另外开线程的,或者是用async或者handler,今天发现其实也可以用android中的一个Intentservice去实现。下面例子讲解下。

1 例子中是一个文本框,当用户输入内容后,模拟slepp 10秒,这个时候要是不分离线程,操作的话,用户再点界面,就会死死地停在那里,甚至是出现提示,要强行CLOSE,代码如下:

1. EditText input = (EditText) findViewById(R.id.txt_input);   
2. String strInputMsg = input.getText().toString();
3. 30000); // 30 seconds, pretend to do work TextView result = (TextView) findViewById(R.id.txt_result); result.setText(strInputMsg + " " + DateFormat.format("MM/dd/yy h:mmaa", System.currentTimeMillis()));


EditText input = (EditText) findViewById(R.id.txt_input);
String strInputMsg = input.getText().toString();
SystemClock.sleep(30000); // 30 seconds, pretend to do work TextView result = (TextView) findViewById(R.id.txt_result); result.setText(strInputMsg + " " + DateFormat.format("MM/dd/yy h:mmaa", System.currentTimeMillis()));


 


2 下面是使用IntentService


   首先,我们搞一个类SimpleIntentService,继承了IntentService


    1. public class SimpleIntentService extends
    2. public static final String PARAM_IN_MSG = "imsg";
    3. public static final String PARAM_OUT_MSG = "omsg";
    4.
    5. public
    6. super("SimpleIntentService");
    7. }
    8.
    9. @Override
    10. protected void
    11.
    12. String msg = intent.getStringExtra(PARAM_IN_MSG);
    13. 3000); // 30 seconds
    14. " "
    15. "MM/dd/yy h:mmaa", System.currentTimeMillis());
    16. "SimpleIntentService", "Handling msg: "
    17.
    18. new
    19. broadcastIntent.setAction(ResponseReceiver.ACTION_RESP);
    20. broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
    21. broadcastIntent.putExtra(PARAM_OUT_MSG, resultTxt);
    22. sendBroadcast(broadcastIntent);
    23. }


    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);
    }


       我们将跟主界面线程分离的操作都写在这里的ononHandleIntent中,这里首先通过


    主线程传递的Intent中,获得用户文本框中输入的内容,放到变量msg中,然后


    又建立一个Intent,把结果放到这个Intent中去,然后再sendBroadcast(broadcastIntent)广播出去,丢回给主线程。



    3 在主线程中,这样启动:


     

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


    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);


     


    4 同时,在主线程中,也要有一个receive接收


     

    1. public class ResponseReceiver extends
    2. public static final String ACTION_RESP = "com.mamlambo.intent.action.MESSAGE_PROCESSED";
    3. @Override
    4. public void
    5.
    6. // Update UI, new "message" processed by SimpleIntentService
    7. TextView result = (TextView) findViewById(R.id.txt_result);
    8. String text = intent.getStringExtra(SimpleIntentService.PARAM_OUT_MSG);
    9. result.setText(text);
    10. }
    11.
    12. }
    13.
    14.



    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);
    }

    }


      当然,要注册这个broadcastReceiver,


    1. public void
    2. super.onCreate(savedInstanceState);
    3. setContentView(R.layout.main);
    4.
    5. new
    6. filter.addCategory(Intent.CATEGORY_DEFAULT);
    7. new
    8. registerReceiver(receiver, filter);
    9. }


    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);
    }


      可以看到,intent service还是比较清晰简单的,但至于性能方面,还是要继续学习,


    迟点继续研究下这玩意哦  


    标签:String,intentservice,SimpleIntentService,Intent,result,input,Android,public
    From: https://blog.51cto.com/u_14230175/5911931

    相关文章