Android:Service通知Activity更新介面
Android有四大元件,其中包括service和activity,那麼在使用的過程中,我們最常遇到的問題是他們之間的通訊問題。
1.首先Activity呼叫Service
這個是比較基礎的,它有兩種常見的方法;
1. 通過Intent
可以指定package name和class name的方式來呼叫,Intent.setClassName這個成員即可。通過putString來裝載資料,startService(intent)即可例子如下:
Intent regIntent = new Intent(“com.service”);
regIntent.putExtra(“data”, "helloData" );
startService(regIntent);
2.通過IPC
IPC有點複雜,想要了解的可以去查有關IBinder的一些資料。
2.Service將狀態告訴Activity
方法有兩種
1.service 通過廣播的形式傳送broadcast
我們寫一個broadcastReceiver即可,通常的情況,將broadcastReceiver寫成Activity的內部類,這個onReceiver可以直接呼叫activity的方法來更新介面。但是內部類只能採用程式碼註冊的方法registerReceiver(),不能再AndroidManifest.xml檔案中進行靜態的宣告,因為內部類要依賴於外部類而存在的。如果你一定要用AndroidManifest來註冊receiver,那麼只能把broadcastReceiver寫成單獨的檔案的public類。這時候,你想更新介面就比較麻煩了,你只能自己把你要更新的activity執行起來,然後再向這個activity的內部類發廣播的訊息來更新介面
2.service直接向activity發intent
在service裡面進行startActivity是屬於在Activity外startActivity即在task外啟動activity,因此,必須在intent加入一個引數如下:
Intent intentSend = new Intent(Constants.ACTION_STATUS);
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent1.putExtra(“statues“,“end“);
context.startActivity(intent1);
但是此時會引發的一個問題是,多次startActivity會導致很多的activity實現被執行,這肯定不是我們要的,我只要一個Activity就可,此時,我們要在androidManifest裡面對這個activity的launchMode設定為singleInstance
<activity android:name="com.demo.Activity"
android:label="@string/online" android:launchMode="singleInstance">
記住啦,有人設定為singleTask,也可以,但他們有一點區別。
同時記住要更新intent,這樣getInstent才可以得到每次的新例項
@Override
protected void onNewIntent (Intent intent){
setIntent(intent);
}