2013-05-29 166 views
13

我需要讓應用程序啓動後廣播接收器始終運行。關閉應用程序後繼續運行廣播接收器

下面是在應用程序

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

和代碼註冊該接收器的接收器

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

您可以使用一個服務

在主應用程序的啓動/停止該服務的代碼

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

您可以啓動在前臺運行的服務。這是確保(主要)確保您的應用能夠獲得事件的唯一方法。在操作系統發生瘋狂的內存壓力時,你的前臺服務仍然有可能會被殺死(所以它不是萬無一失的)。如果你在前臺啓動一個服務,用戶會看到一個持久通知,以知道它始終在運行。

因此,故事的寓意是,您是否真的需要始終監控屏幕關閉/開啓事件?他們強迫你註冊一個不在清單中的接收者的原因是他們不希望人們總是監視這些事件並放慢設備速度。你想達到什麼目的?

5

如果申報清單中的廣播接收器,它將始終是積極的,並且即使關閉應用程序調用/停止

+5

無法在清單文件中聲明SCREEN_ON和SCREEN_OFF。 – alfoks

+0

@alfoks:爲什麼SCREEN_ON和SCREEN_OFF不能在AndroidManifest中聲明?你能解釋一下 – Kushal

+0

@Kushal他們是如何選擇實施它的。我不記得背後的理由。 – 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

因此,在您的特定事件, 你必須創建一個服務&你將不得不在服務的onCreate(顯式地註冊你的事件)與Context.registerReceiver()。

對於其他事件, 進入清單是足夠的。

相關問題