定期的な処理をするWidgetを作っていたのだけど

バッテリー消費だったりのめんでホームがスリープしたら処理をやめたい。


なのでSCREEN_ONとかSCREEN_OFFとかで

Broadcastで捕まえて処理のON,OFFをしたかったのだけど

はまったのでメモ。


通常と同じでこんな感じでいけるかなと思ったら飛ばない。

-------------------------------------

<receiver android:name=".WidgetProvider"
android:label="@string/app_name"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.SCREEN_ON"/>
<action android:name="android.intent.action.SCREEN_OFF"/>

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

-------------------------------------


いろいろぐぐった所、

どうやらプログラム側でもセットしてあげないといけないよう(・ω・)


AppWidgetProviderならこんな感じ。

※その他の処理は省いてます。

-------------------------------------

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);



 //メインの処理など


 //ここで設定

IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);


context.getApplicationContext().registerReceiver(new BroadcastReceiver() {


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

if (Intent.ACTION_SCREEN_ON.equals( intent.getAction())) {
//SCREEN_ONの処理


}else if(Intent.ACTION_SCREEN_OFF.equals( intent.getAction())){

//SCREEN_OFFの処理


}
}
}, filter);

}


-------------------------------------


これでSCREEN_ONとかSCREEN_OFFを捕まえられるようになった。


なんだかんだで結構な時間つぶした。。。



追加補足****************************************************

どうやらタスクキラーなどで切るされると初期化されるため

再度、セットしてあげないといけない様子。


onUpdateでセットした場合、タスクキラーされたあとに別に呼ばれないため

別の方法でセットしてあげる必要がある。


時計ウィジェットなどでAlarmManagerでレシーブしている場合

onReceive内でフラグもって再セットと思ったが

そのままやると大量のレシーバーができてしまう。

なんかいい方法を模索中。。


あと上記ではonUpdateで例を書いているけど

本来はonEnabledで書くべきかと思う。

だってウィジェットが複数配置されるたびにレシーバー作っちゃうし。。。



続きを書きました。