运行 接收者,即使应用程序未打开
Running a receiver even if the app is not open
好吧,几个月前我学习了 android 的基础知识,现在我正在努力练习以记住我学到的东西。所以问题是我正在做一个应用程序,当它捕捉到屏幕状态的变化时(屏幕 on/screen 关闭)它会做一些事情。我希望当应用程序不是 运行(因为用户通过按主页按钮或类似按钮杀死它)时,它仍然可以执行我想要的操作。我已经决定使用接收器,但我不知道它是否是正确的选择。
如果应用程序被最小化,它可以正常工作,但当用户按下 "recent apps" 按钮并滑动应用程序时出现问题。然后接收器什么也抓不到。
我在清单中声明:
<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>
我的主要activity(也许我那里有问题):
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.
谢谢
您已在清单中注册接收器。所以不要在MainActivity中注册和注销它。那就是问题所在。因此,一旦该应用程序被终止,onDestroy()
就会被调用,您的接收器将被注销并且将不再收听。
在清单中声明接收器意味着您的应用将始终收听广播。而这正是您想要的。因此,从 MainActivity 中删除 register/unregister 部分。
更新:似乎SCREEN_ON和SCREEN_OFF 无法通过清单注册。这可能是出于安全原因。因此,在这种情况下,您必须通过代码进行注册。但这里的问题是,一旦你退出应用程序, onDestroy() 就会被调用,你就不再听了。如果您的应用程序确实需要此功能,则必须创建一个服务并在后台持续提供 运行。你可以用它来收听广播。
好吧,几个月前我学习了 android 的基础知识,现在我正在努力练习以记住我学到的东西。所以问题是我正在做一个应用程序,当它捕捉到屏幕状态的变化时(屏幕 on/screen 关闭)它会做一些事情。我希望当应用程序不是 运行(因为用户通过按主页按钮或类似按钮杀死它)时,它仍然可以执行我想要的操作。我已经决定使用接收器,但我不知道它是否是正确的选择。
如果应用程序被最小化,它可以正常工作,但当用户按下 "recent apps" 按钮并滑动应用程序时出现问题。然后接收器什么也抓不到。
我在清单中声明:
<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>
我的主要activity(也许我那里有问题):
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.
谢谢
您已在清单中注册接收器。所以不要在MainActivity中注册和注销它。那就是问题所在。因此,一旦该应用程序被终止,onDestroy()
就会被调用,您的接收器将被注销并且将不再收听。
在清单中声明接收器意味着您的应用将始终收听广播。而这正是您想要的。因此,从 MainActivity 中删除 register/unregister 部分。
更新:似乎SCREEN_ON和SCREEN_OFF 无法通过清单注册。这可能是出于安全原因。因此,在这种情况下,您必须通过代码进行注册。但这里的问题是,一旦你退出应用程序, onDestroy() 就会被调用,你就不再听了。如果您的应用程序确实需要此功能,则必须创建一个服务并在后台持续提供 运行。你可以用它来收听广播。