1. 程式人生 > >service和activity之間通訊

service和activity之間通訊

         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)你也可以傳送個全域性廣播。