2013-05-29 11 views
13

アプリケーションの起動後も常にブロードキャストレシーバーを稼働させておく必要があります。アプリケーションが終了した後もブロードキャストレシーバーを稼働させ続ける

ここでは、サービスを停止/メインアプリ起動でサービス

を使用できるアプリケーションで受信

public class ScreenEventsReceiver extends BroadcastReceiver { 
    public static boolean wasScreenOn = true; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
      wasScreenOn = false; 
      Log.d("ScreenEventReceiver", "ON"); 
     } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
      wasScreenOn = true; 
      Log.d("ScreenEventReceiver", "ON"); 
     } 
    } 
} 
+0

[サービス](https://developer.android.com/reference/android/app/Service.html) –

+0

を作成することもできますが、イベントの受信はどうですか? –

+1

画面のオン/オフイベントを本当に監視する必要がありますか?彼らがマニフェストに含まれていないレシーバを登録するように強制する理由は、人々が常にこれらのイベントを監視してデバイスを減速させたくないからです。 – natez0r

答えて

17

ため

IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
    filter.addAction(Intent.ACTION_SCREEN_OFF); 
    BroadcastReceiver mReceiver = new ScreenEventsReceiver(); 
    registerReceiver(mReceiver, filter); 

とコードをこの受信機を登録するコードがあります

Intent service = new Intent(context, MyService.class); 
context.startService(service); 
... 
Intent service = new Intent(context, MyService.class); 
context.stopService(service); 

サービス

public class MyService extends Service 
{ 
private static BroadcastReceiver m_ScreenOffReceiver; 

@Override 
public IBinder onBind(Intent arg0) 
{ 
    return null; 
} 

@Override 
public void onCreate() 
{ 
    registerScreenOffReceiver(); 
} 

@Override 
public void onDestroy() 
{ 
    unregisterReceiver(m_ScreenOffReceiver); 
    m_ScreenOffReceiver = null; 
} 

private void registerScreenOffReceiver() 
{ 
    m_ScreenOffReceiver = new BroadcastReceiver() 
    { 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
    Log.d(TAG, "ACTION_SCREEN_OFF"); 
    // do something, e.g. send Intent to main app 
    } 
    }; 
    IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF); 
    registerReceiver(m_ScreenOffReceiver, filter); 
} 
} 
+0

これは回答として受け入れられるべきです。 – Talha

0

フォアグラウンドで実行されているサービスを開始できます。それはあなたのアプリがイベントを(ほとんど)確保する唯一の方法です。あなたの前景サービスが、OSからの狂った記憶圧迫の時に殺される可能性はまだあります(だから、それは絶対ではありません)。フォアグラウンドでサービスを開始すると、ユーザーには常に実行中であることを知らせる永続通知が表示されます。

ストーリーのモラルは、オフ/オンイベントを常時監視する必要がありますか?彼らがマニフェストに含まれていないレシーバを登録するように強制する理由は、人々が常にこれらのイベントを監視してデバイスを減速させたくないからです。あなたは何を達成しようとしていますか?

5

あなたがマニフェストにBroadcastReceiverを宣言すると、それは常にアクティブになりますと呼ばれるアプリケーションを閉じても/あなたは、Android 4.4.xからを使用している場合は殺すバグがあるように注意してください

+5

SCREEN_ONおよびSCREEN_OFFは、マニフェストファイルで宣言できません。 – alfoks

+0

@alfoks:AndroidManifestでSCREEN_ONとSCREEN_OFFを宣言できないのはなぜですか?あなたは説明することができます – Kushal

+0

@クシャールそれは彼らがそれを実装する方法を選択しただけです。私はこの背後にある正当性を覚えていません。 – alfoks

0

あなたがマニフェストで宣言されたコンポーネントを介しいくつかの放送イベントを受け取ることができません。

これらのイベントは

  • ACTION_BATTERY_CHANGED
  • ACTION_CONFIGURATION_CHANGED
  • ACTION_SCREEN_OFF (あなたはこのイベントでプレーしている)
  • ACTION_SCREEN_ON (あなたはこのイベントでプレーしている)
  • ACTION_TIME_TICKです

リファレンスhttps://developer.android.com/reference/android/content/Intent.html#ACTION_SCREEN_ON

だからあなたの特定のイベントで、 あなたは)Context.registerReceiver(ととの)あなたがサービスのonCreate(に明示的にイベントを登録する必要がありますサービス&を作成する必要があります。

他のイベントの場合、 マニフェストのエントリで十分です。

関連する問題