Как я могу поддерживать постоянный BroadcastReceiver в расширении Dashclock?
Вот код лесов моего расширения Dashclock. Он получает сообщения от GCM и отображает информацию.
public class ComputerWidget extends DashClockExtension {
private MessageReceiver objMessageReceiver;
private class MessageReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context ctxContext, Intent ittIntent) {
GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(ctxContext);
String strType = gcm.getMessageType(ittIntent);
if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(strType)) {
showInformation(ittIntent.getExtras());
}
}
}
@Override
protected void onInitialize(boolean booReconnect) {
super.onInitialize(booReconnect);
if (objMessageReceiver != null) {
try {
unregisterReceiver(objMessageReceiver);
} catch (Exception e) {
e.printStackTrace();
}
}
IntentFilter intentFilter = new IntentFilter("com.google.android.c2dm.intent.RECEIVE");
intentFilter.addCategory("com.something.something");
objMessageReceiver = new MessageReceiver();
registerReceiver(objMessageReceiver, intentFilter);
}
public void onCreate() {
super.onCreate();
}
protected void showInformation(Bundle bndBundle) {
final ExtensionData edtInformation = new ExtensionData();
setUpdateWhenScreenOn(true);
try {
if (bndBundle.getString("event").equalsIgnoreCase("logon")) {
edtInformation.visible(true);
edtInformation.expandedTitle(bndBundle.getString("machine"));
edtInformation.expandedBody(getString(R.string.logon, bndBundle.getString("username")));
}
} catch (Exception e) {
edtInformation.visible(false);
}
edtInformation.icon(R.drawable.ic_dashclock);
publishUpdate(edtInformation);
}
public void onDestroy() {
super.onDestroy();
if (objMessageReceiver != null) {
try {
unregisterReceiver(objMessageReceiver);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
protected void onUpdateData(int arg0) {
setUpdateWhenScreenOn(true);
System.out.println("Update");
}
}
Как видите, я регистрирую свой GCM BroadcastReceiver
когда мое расширение инициализировано, и я отменяю регистрацию, когда расширение уничтожено.
Этот кусок кода работает очень хорошо, пока получатель инициализирован, но Dashclock, после периода бездействия, уничтожает расширение, и поэтому я не могу получать сообщения GCM.
Как я могу сохранить BroadcastReceiver
живы, чтобы я мог получать сообщения GCM? Есть ли способ сделать это программно, а не через файл манифеста?
Я пришел к этому решению после моего последнего вопроса относительно BroadcastRecievers
- Как я могу опубликовать обновление для Dashclock, когда мое приложение получает намерение?
1 ответ
Как я могу сохранить BroadcastReceiver живым, чтобы я мог получать сообщения GCM?
Зарегистрируйте его в манифесте, как показывают образцы GCM.
Есть ли способ сделать это программно, а не через файл манифеста?
Нет, но вы можете включить и отключить манифест зарегистрированного получателя через PackageManager
а также setComponentEnabledSetting()
,