【问题标题】:Running a receiver even if the app is not open即使应用程序未打开也运行接收器
【发布时间】:2015-10-21 17:44:18
【问题描述】:

几个月前我学习了 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。
谢谢

【问题讨论】:

    标签: android service screen status receiver


    【解决方案1】:

    您已经在清单中注册了接收器。所以不要在MainActivity中注册和注销它。那就是问题所在。因此,一旦应用程序被终止,onDestroy() 就会被调用,并且您的接收器未注册并且将不再监听。

    在清单中声明接收者意味着您的应用将始终收听广播。这正是你想要的。所以从 MainActivity 中删除注册/注销部分。

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

    【讨论】:

    • 所以在 onDestroy() 我必须消除“if”子句,在 onCreate() 我必须消除这些行我在哪里创建 myReceiverregisterReceiver(myReceiver, filter) 如果我理解正确,不是吗?
    • 是的。您可以通过清单或 java 代码注册广播接收器。由于您已经在清单中注册了它,因此不再需要在代码中进行。
    • 不幸的是,它仍然无法正常工作。事实上,即使应用程序正在运行,它现在也不起作用。有什么想法吗?
    • 有趣。这意味着您通过清单注册的接收器从一开始就没有工作,只有通过代码注册的工作在工作问题在于它在清单中注册的方式。您能否从意图过滤器中删除一项操作并尝试。
    • 我已经删除了&lt;action android:name="android.intent.action.SCREEN_ON"/&gt;,但我没有看到日志,也没有显示 toast :(
    猜你喜欢
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多