Как я могу поддерживать постоянный 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(),

Другие вопросы по тегам