2017-02-26 79 views
0

我想检测屏幕关闭和事件,因为我创建了BroadcastReceiver,它只适用于应用程序运行时,当我从任务管理器中删除应用程序,然后它不起作用。BroadcastReceiver在ANDROID屏幕开/关应用程序未运行时

活动:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    try{ 
     BroadcastReceiver myrcver = new BootReceiver(); 
     IntentFilter screenStateFilter = new IntentFilter(); 
     screenStateFilter.addAction(Intent.ACTION_SCREEN_ON); 
     screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF); 
     registerReceiver(myrcver, screenStateFilter); 
    } 
    catch (Exception e){ 
     e.fillInStackTrace(); 
    } 
} 

Menifest:

<receiver 
     android:name=".BootReceiver" 
     android:enabled="true" 
     android:exported="true" 
     android:label="BootReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      <action android:name="android.intent.action.SCREEN_OFF" /> 
      <action android:name="android.intent.action.SCREEN_ON" /> 
     </intent-filter> 
    </receiver> 

广播Reciever:

public class BootReceiver extends BroadcastReceiver { 
boolean screenOff; 
@Override 
public void onReceive(Context context, Intent intent) { 
    try { 
     if ("android.intent.action.SCREEN_ON".equals(intent.getAction())) { 
      if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
       screenOff = true; 
      } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
       screenOff = false; 
      } 
      Intent i = new Intent(context, UpdateService.class); 
      i.putExtra("screen_state", screenOff); 
      context.startService(i); 
     } 
    } 
    catch (Exception e){ 
     e.fillInStackTrace(); 
    } 
} 

}

帮助是欣赏提前。

+0

“这只有当应用程序正在运行,当我从任务管理器中删除应用程序,然后它不工作正常作品“ - 正确。这些只是一些广播中的两个,它们只被传递给使用registerReceiver()的正在运行的进程。 – CommonsWare

回答

1

如果您希望它在后台运行,即使应用程序未运行,您也必须创建一个服务。 在服务类中,您将不得不注册到Receiver。

<service android:name="com.myapp.services.ScreenOnOffService" /> 

然后开始你可以在你的主要活动写这篇文章的服务:

Intent intent = new Intent(this, ScreenOnOffService.class); 
startService(intent); 

public class ScreenOnOffService extends Service { 

    private ScreenOnOffReceiver mScreenReceiver; 

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

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

    @Override 
    public void onDestroy() { 
     unregisterScreenStatusReceiver(); 
    } 

    private void registerScreenStatusReceiver() { 
     mScreenReceiver = new ScreenOnOffReceiver(); 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction(Intent.ACTION_SCREEN_OFF); 
     filter.addAction(Intent.ACTION_SCREEN_ON); 
     registerReceiver(mScreenReceiver, filter); 
    } 

    private void unregisterScreenStatusReceiver() { 
     try { 
      if (mScreenReceiver != null) { 
       unregisterReceiver(mScreenReceiver); 
      } 
     } catch (IllegalArgumentException e) {} 
    } 
} 

创建服务类不要忘记你的服务添加到清单后

对于广播级:

public class ScreenOnOffReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
      Log.d("StackOverflow", "Screen Off"); 

     } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
      Log.d("StackOverflow", "Screen On"); 
     } 
    } 
} 

注意:对于我screen offscreen on,没有不是工作清单内,但只在运行时。当应用程序不仅运行,如果你在添加权限wake.lock

+0

感谢您的帮助,但我已经试过了,它在应用程序关闭时不会工作 –

+0

您是否记得在AndroidManifest中注册服务? CookieMonster

+0

是的,我注册了它 –

0

撒施reciever可以运行你的清单

相关问题