首先,我已经搜索了这个问题并找到了大约2-3个stackoverflow链接,但我没有得到明确的答案。基本上,我的应用程序需要在手机停靠时(任何类型的停靠站)或屏幕时启动活动关闭。我在清单中注册了一个广播接收器:
<receiver android:name=".BootReciever">
<intent-filter >
<action android:name="android.intent.action.ACTION_DOCK_EVENT"/>
<action android:name="android.intent.action.SCREEN_OFF"/>
</intent-filter>
</receiver>
在我班上:
public class BootReciever extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(action.equals(Intent.ACTION_DOCK_EVENT)){
//work for dock
}
if (action.equals(Intent.ACTION_SCREEN_OFF)) {
//work for screen off
}
}
}
但两者都不起作用。我的工作没有完成是两种情况。我读到我必须在服务中做,但因为我从来没有使用我自己的服务,我失去了android.developers.com有点亲友好,我很难让它工作。可以有人说我如何实现上述目标?我的应用程序必须听它长期服务。即使我的应用程序不在前台。谢谢你的帮助。
答案 0 :(得分:0)
这些意图的接收器需要在代码中动态注册。
this.receiver = new BootReceiver();
final IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_DOCK_EVENT);
this.registerReceiver(receiver, filter);
您可以在任何活动中执行此操作(在onStart(中注册),在onStop(中取消注册,请参阅visible lifetime部分)或在您的应用程序对象中。
动态注册的问题是你的应用程序必须在BootReceiver接收意图之前启动。
答案 1 :(得分:0)
SCREEN_OFF
肯定会以编程方式注册(例如,请参阅this link,它是protected intent):
public class MainActivity extends Activity {
BroadcastReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("TAG", "on or off");
}
};
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
Log.d("TAG", "Register receiver");
registerReceiver(receiver, filter);
} catch (Exception e) {
Log.d("TAG", "Caught: " + e.getStackTrace());
}
}
@Override
public void onDestroy() {
super.onDestroy();
try {
Log.d("TAG", "Unregister receiver");
unregisterReceiver(receiver);
} catch (Exception e) {
Log.d("TAG", "Caught: " + e.getStackTrace());
}
}
}
对于ACTION_DOCK_EVENT
,我会假设其他错误。可能由于与ACTION_SCREEN_OFF
的组合而无效,可能是由于命名问题(例如,我不期望.BootReciever
的相对路径;如果已满,请检查合格的班级名称有效。)
希望这有帮助....干杯!