0

这些广播接收器都没有被触发,但在另一个我的应用程序正在我用来检查网络状态的地方工作。关于这个问题,我无话可说。

package monitor;

import android.content.BroadcastReceiver;

public class Monitor extends BroadcastReceiver {

      @Override
      public void onReceive(Context context, Intent intent) {
          System.out.println("jupi");
    }
}



<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="monitor"
  android:versionCode="1"
  android:versionName="1.0">
<uses-sdk
    android:minSdkVersion="9" 
    android:targetSdkVersion="15"/>

<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

<application 
    android:icon="@drawable/icon"
    android:label="@string/app_name">
    <service 
        android:name=".MonitorService">
    </service>
    <receiver 
        android:name=".Monitor">
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            <action android:name="android.intent.action.PHONE_STATE" />
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>

</application>

4

1 回答 1

5

如果您在 Android 3.1 或更高版本上看到此行为,您可能会看到此更改的结果:

http://developer.android.com/about/versions/android-3.1.html#launchcontrols

尤其是读这个:

请注意,系统将 FLAG_EXCLUDE_STOPPED_PACKAGES 添加到所有广播意图。这样做是为了防止来自后台服务的广播无意或不必要地启动已停止应用程序的组件。

由于您的应用程序仅包含服务和接收器,因此用户将永远不会启动此应用程序,因此 if 将保持“停止”状态,从而阻止它看到任何广播意图。

当您将 Activity 添加到应用程序时,运行一次就足以将应用程序从“停止”状态中移除,这样您的接收器就有资格接收广播意图。您实际上不需要动态注册接收器。安装后让用户“启动”一次应用程序就足够了。

于 2012-06-30T15:56:50.523 回答