广播接收器不工作。在清单中声明

时间:2017-02-17 15:04:11

标签: android broadcastreceiver intentfilter

我有一个BroadcastReciever和一个服务。建立Internet连接后,必须启动下载某些数据的服务。

我的BroadcastReceiver

public class NetworkStateListener extends BroadcastReceiver
{

@Override
public void onReceive(Context c, Intent intent)
    {
    Toast.makeText(c,"started",Toast.LENGTH_SHORT).show();
    c.startService(new Intent(c,DataDownloader.class));

    // TODO: Implement this method
    }

 }

以下是Manifest的一些代码......

<receiver android:name="com.Example.SGSN.worker.NetworkStateListener" 
        android:enabled="true">
        <intent-filter android:priority="999">
            <action android:name="android.net.wifi.WifiManager.NETWORK_STATE_CHANGED_ACTION"/>
            <action android:name="android.net.wifi.WIFI_STATE_CHANGED"/>
            <action android:name="android.net.wifi.WifiManager.SUPLICANT_STATE_CHANGED_ACTION"/>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
        </intent-filter>
    </receiver>

并请求权限......

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

甚至没有一个动作被触发。我不知道我犯了什么错误。我也在寻找答案,但我的问题没有解决。  当我在动态中注册活动时,BroadcastReceiver正常工作。我需要它在后台。有人帮忙。

4 个答案:

答案 0 :(得分:1)

你应该删除:

android:process=":channel"

<强> UPD

这里100%工作的清单代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.andrey.test">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main2">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

        <receiver
            android:name=".MyReceiver"
            android:enabled="true">
            <intent-filter>
                <action android:name="android.net.wifi.WifiManager.NETWORK_STATE_CHANGED_ACTION" />
                <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
                <action android:name="android.net.wifi.WifiManager.SUPLICANT_STATE_CHANGED_ACTION" />
                <action android:name="android.net.conn.CONNECTIVITY_ACTION" />
            </intent-filter>
        </receiver>

    </application>

</manifest>

答案 1 :(得分:1)

在清单中,您是否在应用程序标记内设置了接收者标记?

喜欢:

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <receiver android:name=".NetworkChangeReceiver" >
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
        </intent-filter>
    </receiver>
</application>

答案 2 :(得分:1)

尝试这样的实现:

首先,您的服务将监听互联网连接的变化:

public class SyncService extends Service {

public static Intent getStartIntent(Context context) {
    return new Intent(context, SyncService.class);
}


@Override
public void onCreate() {
    super.onCreate();
}

@Override
public int onStartCommand(Intent intent, int flags, final int startId) {
    Timber.i("Starting sync...");

    if (!NetworkUtil.isNetworkConnected(this)) {
        Timber.i("Sync canceled, connection not available");
        stopSelf(startId);
        return START_NOT_STICKY;
    }

    //Here you can define what you need to do when internet is available
    //Can download from internet and sync to local for example

    return START_STICKY;
}

@Override
public void onDestroy() {
    if (mSubscription != null) mSubscription.unsubscribe();
    super.onDestroy();
}

@Override
public IBinder onBind(Intent intent) {
    return null;
}

public static class SyncOnConnectionAvailable extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)
                && NetworkUtil.isNetworkConnected(context)) {
            Timber.i("Connection is now available, triggering sync...");
            context.startService(getStartIntent(context));
        }
    }
}

广播接收器将启动该服务,然后根据您在onStartCommand()中的指示行事;

接下来在清单中声明服务,如下所示:

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

<service android:name=".SyncService"/>

<receiver
    android:name=".SyncService$SyncOnConnectionAvailable"
    android:enabled="false">
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>

这将在检测到网络更改时随时通知服务。

现在您需要从任何活动启动服务,因为您希望服务在后台运行,我毫无疑问这将是您的主要活动。此示例仅在按照我的示例启动主活动时触发。你可以根据自己的喜好调整它。

主要活动:

public class MainActivity {

    public static Intent getStartIntent(Context context) {
        Intent intent = new Intent(context, MainActivity.class);
        return intent;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //this is where you start the service and it will start listening for connectivity changes 
        if (getIntent().getBooleanExtra(EXTRA_TRIGGER_SYNC_FLAG, true)) {
            startService(SyncService.getStartIntent(this));
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }
}

这只是一个可以派上用场的NetworkUtil类:

public class NetworkUtil {

    public static boolean isNetworkConnected(Context context) {
        ConnectivityManager cm =
            (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
    }

}

将从MainActivity onCreate()中的这两行触发服务。根据您的需要调整此示例。我在https://github.com/ribot/android-boilerplate/找到的ribot样板代码示例中使用了此示例的部分内容。

答案 3 :(得分:0)

Android Nougat(API 24)。在Manifest中声明的广播接收器将不再被警告&#34; android.net.conn.CONNECTIVITY_CHANGE&#34;事件。有助于节省电池:)。较早版本的Android不受影响。

要在Nougat中收听此事件,您必须以编程方式注册广播。