service和activity之間通訊
阿新 • • 發佈:2019-02-04
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)你也可以傳送個全域性廣播。