Android~Service+BroadcastReceiver使用
发布日期:2021-06-29 13:13:01
浏览次数:3
分类:技术文章
本文共 6560 字,大约阅读时间需要 21 分钟。
由于项目需要,我们有时候需要在service中处理耗时操作,然后将结果发送给activity以更新状态。通常情况下,只需要在一个service与一个activity之间通信,这种情况下,我们使用最多的是通过回调接口。具体做法是在service中定义一个接口,在activity中实现改接口,并通过bindservice来传入。当需要将service中的结果一次发送给多个activity时,我们又该如何实现呢?经过检索,存在三种实现的方式,分别是回调接口、广播接收者和观察者模式 。
本文主要讲解比较推荐的方式——广播接收者。通过广播接收者 ,在service中执行完耗时操作后,将结果以广播的形式发送,在所有的activity中注册广播,接收到结果后更新UI,这种方式比较简单。因为耗时的操作结果不需要以handler的方式发送到主线程,可以直接在子线程中发送广播,接收者始终运行在主线程中。- Service.java
package com.example.servicecallback;import android.app.Service;import android.content.Intent;import android.os.Binder;import android.os.IBinder;public class ContentService extends Service { @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return new LocalBinder(); } @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); } public final class LocalBinder extends Binder { public ContentService getService() { return ContentService.this; } } public void asyncSendPerson(final String name) { // 休息5秒,模拟异步任务 new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } //可以在子线程中直接发送广播 sendContentBroadcast(name); } }).start(); } /** * 发送广播 * @param name */ protected void sendContentBroadcast(String name) { // TODO Auto-generated method stub Intent intent=new Intent(); intent.setAction("com.example.servicecallback.content"); intent.putExtra("name", name); sendBroadcast(intent); }}
- MainActivity.java
package com.example.servicecallback;import android.app.Activity;import android.content.BroadcastReceiver;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.TextView;public class MainActivity extends Activity { private MyServiceConn conn; private TextView mContent; private ContentReceiver mReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); conn = new MyServiceConn(); bindService(new Intent(this, ContentService.class), conn, BIND_AUTO_CREATE); mContent = (TextView) findViewById(R.id.content); this.findViewById(R.id.button1).setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub startActivity(new Intent(MainActivity.this, OtherActivity.class)); } }); doRegisterReceiver(); } /** * 注册广播接收者 */ private void doRegisterReceiver() { mReceiver=new ContentReceiver(); IntentFilter filter = new IntentFilter( "com.example.servicecallback.content"); registerReceiver(mReceiver, filter); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public class MyServiceConn implements ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder binder) { // service = ((LocalBinder) binder).getService(); } @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub // service = null; } } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); unbindService(conn); if (mReceiver!=null) { unregisterReceiver(mReceiver); } } public class ContentReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String name = intent.getStringExtra("name"); Person person = new Person(); person.setName(name); mContent.setText(person.toString()); } }}
- OtherActivity.java
package com.example.servicecallback;import android.app.Activity;import android.content.BroadcastReceiver;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import com.example.servicecallback.ContentService.LocalBinder;public class OtherActivity extends Activity { private ContentService service; private TextView mContent; private Button mSubmit; private EditText mEditText; private ServiceConnection conn; private ContentReceiver mReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.other); mEditText = (EditText) findViewById(R.id.edittext); mSubmit = (Button) findViewById(R.id.button1); mContent = (TextView) findViewById(R.id.content); mSubmit.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String name = mEditText.getText().toString(); service.asyncSendPerson(name); } }); conn=new MyServiceConn(); bindService(new Intent(OtherActivity.this, ContentService.class), conn, BIND_AUTO_CREATE); doRegisterReceiver(); } private void doRegisterReceiver() { mReceiver=new ContentReceiver(); IntentFilter filter = new IntentFilter( "com.example.servicecallback.content"); registerReceiver(mReceiver, filter); } public final class MyServiceConn implements ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder binder) { service = ((LocalBinder) binder).getService(); } @Override public void onServiceDisconnected(ComponentName name) { service = null; } } @Override protected void onDestroy() { super.onDestroy(); unbindService(conn); if (mReceiver!=null) { unregisterReceiver(mReceiver); } } public class ContentReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String name = intent.getStringExtra("name"); Person person = new Person(); person.setName(name); mContent.setText(person.toString()); } }}
转载地址:https://chalk.blog.csdn.net/article/details/51560195 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
关注你微信了!
[***.104.42.241]2024年04月03日 04时00分53秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
突破边界:数据科学、数据工程和技术的未来
2019-04-29
一切有迹可循!优秀程序员的9个早期迹象
2019-04-29
在后台的python:众多程序员无法攻克的难题
2019-04-29
未来战争:装载AI的美国空军侦察机已经试飞……
2019-04-29
屡战屡败:为什么你会觉得学习编程很难?
2019-04-29
“狙击”特斯拉:电动汽车后起之秀的最后一战
2019-04-29
软件测试的未来:2021年需要关注的15大软件测试趋势
2019-04-29
六大基本AI术语:如何做好人工智能咨询服务?
2019-04-29
讲真,如果手机有灵魂,那就是“备忘录”
2019-04-29
端到端加密:WhatsApp不会去读取你的信息,它不需要……
2019-04-29
国会大厦骚乱,与一家极不可靠的面部识别公司……
2019-04-29
解锁宇宙密码:为什么是3、6、9?
2019-04-29
数据可视化中的格式塔心理学
2019-04-29
电动汽车的“专属危险”:网络威胁问题不容小觑
2019-04-29
短暂的告别,马上再回来
2019-04-29
统治50年:为什么SQL在如今仍然很重要?
2019-04-29
测试是一场竞争,而数据每次都会获得胜利
2019-04-29
读心的测谎系统:究竟是骗子还是个天才?
2019-04-29
最大规模技术重建:数据库连接从15000个到100个以下
2019-04-29
复工之后:员工如何改善网络安全?
2019-04-29