簡體   English   中英

來自意圖服務的呼叫活動方法

[英]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 ,它是一種易於使用的數據文件,您可以從應用程序內的任何位置(例如, receiveractivity )讀取數據文件。
接收器內部-

// 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM