停靠和屏蔽广播服务

时间:2013-06-25 05:12:24

标签: android

首先,我已经搜索了这个问题并找到了大约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有点亲友好,我很难让它工作。可以有人说我如何实现上述目标?我的应用程序必须听它长期服务。即使我的应用程序不在前台。谢谢你的帮助。

2 个答案:

答案 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的相对路径;如果已满,请检查合格的班级名称有效。)

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