从意向服务调用活动方法

时间:2016-08-27 08:48:27

标签: java android

关于如何使用广播接收器或接口从服务调用活动方法有很多问题。但这些例子通常与我的案例不同。

我有一个向服务器发送注册请求的活动。此服务器通过谷歌云消息传递(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 。如果应用程序关闭,这个接收器会工作吗?或者如果它关闭了,它会把活动带到前面(我不想要这个)吗?

2 个答案:

答案 0 :(得分:1)

你可以通过重新创建你的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
}

答案 1 :(得分:0)

我能为您的问题考虑的最简单方法是使用 Try it at SassMeister 。 在我目前的项目中,有信标impl ...每当我在后台服务中收到来自信标的信号时,我就会向活动广播意图。

<强>的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"/>放在清单中,则它可能无法正常工作。

     

确保在活动被销毁后取消注册。 :-)。