마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

잘 작동하던 위젯이 폰이 장시간 쉬면 죽어버립니다.

0 추천

지금 하나의 서비스에서 3개의 위젯과 메세지를 주고받도록 만들고 있습니다.

3개의 위젯은 화면에 나오는 구성만 다르고 안에 주고받는 메세지 같은건 동일합니다.

처음 위젯을 설치하고 실행하면 서비스와 원활하게 정보를 주고 받습니다.

위젯을 클릭하면 액티비티가 켜지고, 1분이 경과되면 위젯 내용이 갱신되고,

버튼을 눌러도 위젯 내용이 갱신이 됩니다.

하지만 핸드폰을 장시간 미사용하고 난 뒤에 위젯에서 처리하던 내용들이 모두 중지되어 있습니다.

그래도 1분이 지나면 다시 위젯이 활성화 되어 액티비티도 켜지고 내용도 갱신됩니다.

중지되지 않게 해결할 방법이 없을까요?

 

지금은 현재 스크린이 켜지면 위젯을 업데이트 시키는 메세지를 보내려고 하지만,

<manifests.xml 일부>

<receiver
    android:name=".BusWidget_1x2_2"
    android:enabled="true">
    <intent-filter>
        <action android:name="android.intent.action.SCREEN_ON" />
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        <action android:name="request_update" />
        <action android:name="request_update_color" />
    </intent-filter>

    <meta-data
        android:name="android.appwidget.provider"
        android:resource="@xml/bus_widget_1x2_2_info" />
</receiver>

android.intent.action.SCREEN_ON 메세지를 위젯에 받으려 해도

public void onReceive(final Context context, final Intent intent) {
    super.onReceive(context, intent);

    String action = intent.getAction();
    Log.i("widget 1x2 receive", action);
    if (MainActivity.REQUEST_UPDATE.equals(action)) {
        updateWidget(context, intent.getExtras());
    }
    else if(action.equals("android.intent.action.SCREEN_ON")) {
        AppWidgetManager manager = AppWidgetManager.getInstance(context);
        this.onUpdate(context, manager, manager.getAppWidgetIds(new ComponentName(context, getClass())));
    }/* else if (action.equals(MainActivity.REQUEST_UPDATE_COLOR)) {
        changeWidgetColor(context, intent.getExtras());
    }*/
}

Log내용을 살펴보면 ON_SCREEN 메세지는 폰에 받는다는 부분은 있는데,

위젯의 Log에는 찍히지가 않아요.

 

요약하자면 핸드폰 미사용시 위젯이 갑자기 죽어버리는 것이고요,

저는 폰화면이 켜질때 위젯을 업데이트 시키고 싶은데, 폰화면 켜지는 이벤트가 먹히질 않습니다.

해결방안좀 알려주세요

Mngz 님이 2015년 11월 12일 질문

1개의 답변

+1 추천
 
채택된 답변
SCREEN_ON을 manifest에 등록하는 방법으로는 이벤트를 수신할 수 없습니다.

아래와 같은 방법으로 사용 하셔야 합니다.

IntentFilter screenStateFilter = new IntentFilter();
screenStateFilter.addAction(Intent.ACTION_SCREEN_ON);
registerReceiver(broadcastReceiver, screenStateFilter);

private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {

        }

};

unregisterReceiver(broadcastReceiver);
익명사용자 님이 2015년 11월 12일 답변
서비스의 onCreate()부분에 registerReceiver()를 넣고 onDelete()에 unregisterReceiver()를 넣어두니 잘 되네요!! 감사합니다.
...