<application>
<receiver Android:name=".MyBroadcastReceiver" Android:enabled="true">
<intent-filter>
<action Android:name="Android.intent.action.ACTION_SCREEN_ON"></action>
<action Android:name="Android.intent.action.ACTION_SCREEN_OFF"></action>
</intent-filter>
</receiver>
...
</application>
MyBroadcastReceiver
は、fooをログに吐き出すためだけに設定されます。何もしません。何か提案はありますか?意図をキャッチするために許可を割り当てる必要がありますか?
これらのアクションは、マニフェストに登録されているレシーバーではなく、Javaコード(registerReceiver()
を介して)に登録されているレシーバーのみが受信できると考えています。
または、電源マネージャーを使用して画面ロックを検出できます。
@Override
protected void onPause()
{
super.onPause();
// If the screen is off then the device has been locked
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
boolean isScreenOn;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat_WATCH) {
isScreenOn = powerManager.isInteractive();
} else {
isScreenOn = powerManager.isScreenOn();
}
if (!isScreenOn) {
// The screen has been locked
// do stuff...
}
}
"Android.intent.action.HEADSET_PLUG"
"Android.intent.action.ACTION_SCREEN_ON"
"Android.intent.action.ACTION_SCREEN_OFF"
上記の3つは、マニフェストを使用して登録できません。 Androidコアは「Intent.FLAG_RECEIVER_REGISTERED_ONLY」を追加しました(たぶん..「HEADSET_PLUG」の場合のみコードをチェックしました。
したがって、「動的レジスタ」を使用する必要があります。以下のように...
private BroadcastReceiver mPowerKeyReceiver = null;
private void registBroadcastReceiver() {
final IntentFilter theFilter = new IntentFilter();
/** System Defined Broadcast */
theFilter.addAction(Intent.ACTION_SCREEN_ON);
theFilter.addAction(Intent.ACTION_SCREEN_OFF);
mPowerKeyReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String strAction = intent.getAction();
if (strAction.equals(Intent.ACTION_SCREEN_OFF) || strAction.equals(Intent.ACTION_SCREEN_ON)) {
// > Your playground~!
}
}
};
getApplicationContext().registerReceiver(mPowerKeyReceiver, theFilter);
}
private void unregisterReceiver() {
int apiLevel = Build.VERSION.SDK_INT;
if (apiLevel >= 7) {
try {
getApplicationContext().unregisterReceiver(mPowerKeyReceiver);
}
catch (IllegalArgumentException e) {
mPowerKeyReceiver = null;
}
}
else {
getApplicationContext().unregisterReceiver(mPowerKeyReceiver);
mPowerKeyReceiver = null;
}
}
これを実装する方法は、onCreate()のメインアクティビティでレシーバーを登録することです。事前にレシーバーを定義するだけです。
lockScreenReceiver = new LockScreenReceiver();
IntentFilter lockFilter = new IntentFilter();
lockFilter.addAction(Intent.ACTION_SCREEN_ON);
lockFilter.addAction(Intent.ACTION_SCREEN_OFF);
lockFilter.addAction(Intent.ACTION_USER_PRESENT);
registerReceiver(lockScreenReceiver, lockFilter);
そして、onDestroy():
unregisterReceiver(lockScreenReceiver);
受信機では、次のケースをキャッチする必要があります。
public class LockScreenReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
if (intent != null && intent.getAction() != null)
{
if (intent.getAction().equals(Intent.ACTION_SCREEN_ON))
{
// Screen is on but not unlocked (if any locking mechanism present)
}
else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF))
{
// Screen is locked
}
else if (intent.getAction().equals(Intent.ACTION_USER_PRESENT))
{
// Screen is unlocked
}
}
}
}