关于如何使用广播接收器或接口从服务调用活动方法有很多问题。但这些例子通常与我的案例不同。
我有一个向服务器发送注册请求的活动。此服务器通过谷歌云消息传递(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 。如果应用程序关闭,这个接收器会工作吗?或者如果它关闭了,它会把活动带到前面(我不想要这个)吗?
答案 0 :(得分:1)
你可以通过重新创建你的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
}
答案 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"/>
放在清单中,则它可能无法正常工作。确保在活动被销毁后取消注册。 :-)。