我有一个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正常工作。我需要它在后台。有人帮忙。
答案 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中收听此事件,您必须以编程方式注册广播。