如何从Manifest注册广播接收器?

时间:2016-02-13 20:34:34

标签: android broadcastreceiver android-manifest

我想创建一个没有UI的后台应用。 所以,我有一个广播接收器,我试图从清单中注册它。这就是我在清单中所做的:

<receiver
        android:name="background.broadcastReceivers.GPSStartedReceiver">

        <intent-filter android:priority="100">
            <action
                android:name="android.location.PROVIDERS_CHANGED"
                android:enabled="true"/>
        </intent-filter>
</receiver>

但是当我运行应用程序时,广播接收器永远不会被注册。 当我从测试活动注册我的接收器时,它工作正常。 为什么会发生这种情况?

这就是我在测试活动中所做的事情:

    private GPSStartedReceiver receiver = new GPSStartedReceiver();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Register a broadcast receiver which listens to GPS provider changes
        this.registerReceiver(receiver,
                new IntentFilter("android.location.PROVIDERS_CHANGED"));
    }

2 个答案:

答案 0 :(得分:3)

  

我想创建一个没有UI的后台应用。

这不切实际。

  

但是当我运行应用程序时,广播接收器永远不会被注册。当我从测试活动注册我的接收器时,它工作正常。为什么会发生这种情况?

Manifest-registered接收器在安装时不起作用。它们仅在某些内容使用明确的Intent启动某个应用程序组件之后才能工作。对于99.9%的应用程序,这是他们的主屏幕启动器活动。

答案 1 :(得分:0)

我用以下清单条目写了一个最小的应用程序:

<receiver android:name="test.Receiver">
    <intent-filter>
        <action android:name="android.location.PROVIDERS_CHANGED"/>
    </intent-filter>
</receiver>

和test.Receiver类:

package test;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class Receiver extends BroadcastReceiver {

    @Override
        public void onReceive(Context context, Intent intent) {
            Log.d("@@@", "here");
        }
    }

当我在设备上切换GPS时,会打印我的日志消息。也许你的清单XML中有太多额外的东西?