定期的な処理をする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で書くべきかと思う。
だってウィジェットが複数配置されるたびにレシーバー作っちゃうし。。。