即使应用程序未打开,也要运行接收器

时间:2015-10-21 17:44:19

标签: android service screen status receiver

好几个月前我学会了android的基础知识,现在我正在练习记住我学到的东西。所以问题是,我正在做一个应用程序,当它捕获屏幕状态的变化(屏幕上/屏幕关闭)它做了一些事情。我希望当应用程序没有运行时(因为用户通过按下主页按钮或类似的东西来杀死它)它仍然可以做我想要的。我决定使用接收器,但我不知道它是否是正确的选择。

如果应用程序最小化,它可以工作,但用户按下"最近的应用程序"按钮并滑动应用程序。然后接收器没有抓到任何东西。

在我宣布的清单中:

<receiver android:name=".MyReceiver" android:enabled="true">
    <intent-filter>
       <action android:name="android.intent.action.SCREEN_ON"/>
       <action android:name="android.intent.action.SCREEN_OFF"/>
    </intent-filter>
</receiver>

我的主要活动(也许我有错误):

public class MainActivity extends Activity {

    private MyReceiver myReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        myReceiver = new MyReceiver();
        registerReceiver(myReceiver, filter);
    }


   @Override
   protected void onDestroy() {
       if (myReceiver != null) {
          unregisterReceiver(myReceiver);
          myReceiver = null;
       }
       super.onDestroy();

   }
}

和我的接收者:

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
       String action = intent.getAction();
       if (action.equals("android.intent.action.SCREEN_OFF")) {
          Log.e("In on receive", "In Method: ACTION_SCREEN_OFF");
          Toast.makeText(context, "DO SOMETHING",Toast.LENGTH_LONG).show();
       }
       else if (action.equals("android.intent.action.SCREEN_ON")) {
          Log.e("In on receive", "In Method: ACTION_SCREEN_ON");
          Toast.makeText(context, "DO SOMETHING2",Toast.LENGTH_LONG).show();
       }
    }
}

真的很感激,如果你能看看:D。
谢谢

1 个答案:

答案 0 :(得分:1)

您已在清单中注册了接收器。因此,请勿在MainActivity中注册和取消注册。那就是问题所在。因此,一旦应用程序被杀,onDestroy()将被调用,您的接收者将被取消注册,并且将不再收听。

在清单中声明接收器意味着您的应用将始终收听广播。这正是你想要的。因此,从MainActivity中删除注册/取消注册部分。

更新:似乎无法通过清单注册 SCREEN_ON SCREEN_OFF 。这可能是出于安全原因。因此,在这种情况下,您必须通过代码注册。但问题是,一旦你退出应用程序,就会调用onDestroy()并且你不再听。如果您的应用程序确实需要此功能,则必须创建服务并在后台持续运行。您可以使用它来收听广播。