service和activity通讯一般可以通过绑定service获取service的引用调用service的方法。如果service要访问activity可以通过单利模式,最好是使用广播接受者实现通讯最优方案。
下面介绍通过广播接受者实现activity和service通讯。
XML代码:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.servicedemo2.MainActivity"> <Button android:onClick="send" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="activity发消息" /> </RelativeLayout>
activity代码;
/*使用广播实现service和activity通讯*/ public class MainActivity extends AppCompatActivity { LocalBroadcastManager manager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取局部广播管理员 manager = LocalBroadcastManager.getInstance(this); //注册局部广播 IntentFilter filter = new IntentFilter("activity"); manager.registerReceiver(receiver, filter); //注意一定要启动服务 Intent service = new Intent(this, MyService.class); startService(service); } //发消息 public void send(View view) { Intent intent = new Intent("service"); intent.putExtra("activitySend", "activity发的消息"); manager.sendBroadcast(intent); } @Override protected void onDestroy() { super.onDestroy(); manager.unregisterReceiver(receiver); } //广播接受者 BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { //获取广播消息 String serviceSend = intent.getStringExtra("serviceSend"); if (!TextUtils.isEmpty(serviceSend)) { Toast.makeText(context, serviceSend, Toast.LENGTH_SHORT).show(); } } }; }
//service代码:
public class MyService extends Service { @Nullable @Override public IBinder onBind(Intent intent) { return null; } LocalBroadcastManager manager; @Override public void onCreate() { super.onCreate(); //获取局部广播管理员 manager = LocalBroadcastManager.getInstance(this); //注册局部广播 IntentFilter filter = new IntentFilter("service"); manager.registerReceiver(receiver, filter); } @Override public void onDestroy() { super.onDestroy(); manager.unregisterReceiver(receiver); } //动态 创建广播接受者 BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { //接受广播消息 String activitySend = intent.getStringExtra("activitySend"); if (!TextUtils.isEmpty(activitySend)) { Toast.makeText(context, activitySend, Toast.LENGTH_SHORT).show(); } //延迟发个消息给activity new Thread() { @Override public void run() { super.run(); try { Thread.sleep(3000); //发消息给activity Intent send = new Intent("activity"); send.putExtra("serviceSend", "service发的消息"); manager.sendBroadcast(send); } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); } }; }
//注意这里我是发局部广播(localbroadcastmanage)你也可以发送个全局广播。