[英]Call activity method from intent service
關於如何使用廣播接收器或接口從服務調用活動方法存在許多問題。 但是這些例子常常與我的情況有所不同。
我有一個將注冊請求發送到服務器的活動。 該服務器通過Google雲消息傳遞(GCM)發送請求的答案。 為了得到答案,我使用了一項服務 。
我的清單 :
<!-- receiver to handle GCM messages -->
<receiver
android:name="com.google.android.gcm.GCMBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<!-- Receives the actual messages. -->
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.example.myapp" />
</intent-filter>
</receiver>
<service android:name=".GCMIntentService" />
在我的活動中,我有一個開關。 如果用戶檢查了交換機,則注冊過程開始,並且我禁用了該交換機,因此用戶無法在注冊過程中更改交換機狀態。 一定時間(大約5分鍾)后,服務器將發送答案。
根據答案,我要設置開關的狀態(選中或未選中),然后再次啟用開關。
我的問題是,現在我該如何實現這種行為? 如何在活動中調用方法?
下一個問題是用戶可能會關閉該應用程序,因為請求需要一些時間。 我如何實現即使活動關閉也可以執行該方法?
關於這些問題,我已經在論壇上閱讀過,我將使用LocalBroadcastReceiver 。 如果該應用已關閉,此接收器是否可以工作? 或者,如果它關閉了,它會將活動帶到最前面嗎(我不想要這個)?
您可以做一些變通辦法,通過再次重新創建您的Activity來實現此目的,但這不是最佳實踐(而且代碼編寫也很復雜)。
我將使用SharedPreferences ,它是一種易於使用的數據文件,您可以從應用程序內的任何位置(例如, receiver
或activity
)讀取數據文件。
接收器內部-
// PREFS_FILE_NAME - a static String variable like:
public static final String PREFS_FILE_NAME = "MyPrefsFile";
SharedPreferences.Editor editor = getSharedPreferences(PREFS_FILE_NAME, MODE_PRIVATE).edit();
editor.putBoolean("mySwitchOn", true);
editor.commit();
活動內部-
public static final String PREFS_FILE_NAME = "MyPrefsFile";
SharedPreferences prefs = getSharedPreferences(PREFS_FILE_NAME, MODE_PRIVATE);
Boolean mSwitchOn = prefs.getBoolean("mySwitchOn", true);//"True is the default value if no value was found.
//Do what you need with mSwitchOn
}
我可以想到的最簡單的方法是使用LocalBroadcastManger 。 在我當前的項目中,有一個信標暗示...每當我在后台服務中從信標收到信號時,我都會廣播活動意圖。
AndroidManifest.xml
<service
android:exported="true"
android:name="com.yourpackage.ServiceName"/>
為您服務
Intent i = new Intent();
i.setAction(BeaconHelper.ACTION_BEACON_TRIGGER);
i.putExtra("data", "my_data");
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(i)
在您活動的onCreate()
或onResume()
registerReceiver(mReceiver,new IntentFilter(BeaconHelper.ACTION_BEACON_TRIGGER));
MyReceiver.java
public class MyReceiver extends BroadcastReceiver {
MyReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "onReceive() called with: context = [" + context + "], intent = [" + intent + "]");
try {
switch (intent.getAction()){
case BeaconHelper.ACTION_BEACON_TRIGGER:
//here is my beacon impl
break;
default:
break;
}
} catch (JSONException | NullPointerException e) {
e.printStackTrace();
}
}
}
僅當您的活動和服務在同一過程中時,LocalBroadcastManager才起作用。 如果您已將流程作為
<service process=":myprocess"/>
放在清單中 ,則可能無法正常工作。確保活動銷毀后注銷 。 :-)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.