0

首先,我搜索了这个问题,发现了大约 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 有点亲友好,我很难让它工作。有人能告诉我如何实现上述目标吗?而且我的应用程序必须作为长期服务来监听它。所以即使我的应用程序不在前台。谢谢你的帮助。

4

2 回答 2

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() 中取消注册,参见可见生命周期部分)或在您的应用程序对象中。

动态注册的问题是您的应用程序必须在 BootReceiver 接收意图之前启动。

于 2013-06-25T06:00:17.277 回答
0

必须以SCREEN_OFF编程方式注册(例如,请参阅此链接,这是一个受保护的意图):

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;检查,如果完全限定的类名有效)。

希望这会有所帮助....干杯!

于 2013-06-25T06:17:34.733 回答