Android Oreo-小部件服务和广播接收器:不允许启动服务意图
我有一个监控wifi连接的小部件,所以我启动了一项服务来启动广播接收器来检测网络变化。除了我退出主应用程序外,一切都正常:服务停止 因此,我在小部件中启动了一个报警管理器,它几乎每分钟都会唤醒一次,并检查主应用程序是否已退出。如果是这种情况,我尝试重新启动我的wifi监控服务,但这次它崩溃了,并显示以下消息: 不允许启动服务意图{ cmp=package.CallbackNetworkWidgetService(有附加项)}:应用程序正在运行 背景uid记录{f6e65b9 u0a154 RCVR空闲更改:空闲|未缓存 过程:1序列(0,0,0)} 问题在于oreo新的意图/服务模型。直到牛轧糖 问题:Android Oreo-小部件服务和广播接收器:不允许启动服务意图,android,android-intent,service,broadcastreceiver,android-8.0-oreo,Android,Android Intent,Service,Broadcastreceiver,Android 8.0 Oreo,我有一个监控wifi连接的小部件,所以我启动了一项服务来启动广播接收器来检测网络变化。除了我退出主应用程序外,一切都正常:服务停止 因此,我在小部件中启动了一个报警管理器,它几乎每分钟都会唤醒一次,并检查主应用程序是否已退出。如果是这种情况,我尝试重新启动我的wifi监控服务,但这次它崩溃了,并显示以下消息: 不允许启动服务意图{ cmp=package.CallbackNetworkWidgetService(有附加项)}:应用程序正在运行 背景uid记录{f6e65b9 u0a154 RCV
<receiver android:name=".Widget.TestWidget">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<intent-filter>
<action android:name="AUTO_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/test_widget_info" />
</receiver>
<service android:name=".Widget.CallbackNetworkWidgetService"></service>
Appwidget-startNetworkService
@Override
public int onStartCommand(Intent i, int flags, int startId) {
context = this.getApplicationContext();
Log.i("WIDNET", "onStart network");
isWifiConnected();
return Service.START_NOT_STICKY;
}
public void isWifiConnected(){
BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
getNetworkInfo();
// Log.i("WIDNET", "broadcastReceiver ipwan: "+ipwan+" type: "+type);
}
};
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
context.registerReceiver(broadcastReceiver, intentFilter);
}
public static void startNetworkService(Context context){
int[] allWidgetIds = new int[0];
Log.i("WIDNET", "start network service");
ComponentName thisWidget = new ComponentName(context,
TestWidget.class);
if(widgetManager != null)
allWidgetIds = widgetManager.getAppWidgetIds(thisWidget);
if(intentNetwork != null) {
CallbackNetworkWidgetService cnws = new CallbackNetworkWidgetService();
cnws.stopSelf();
Log.i("WIDNET", "stop network service");
}
intentNetwork = new Intent(context.getApplicationContext(),
CallbackNetworkWidgetService.class);
intentNetwork.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds);
context.startService(intentNetwork);
}
为此,您需要使用前台服务
ContextCompat.startForegroundService(context, intentNetwork);
不要忘记api 26+的通知:
@Override
public int onStartCommand(Intent i, int flags, int startId) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
Notification.Builder builder = new Notification.Builder(this, ANDROID_CHANNEL_ID)
.setContentTitle("wifi listener bla bla bla")
.setContentText(text)
.setAutoCancel(true);
Notification notification = builder.build();
startForeground(1, notification);
}
//...
}
我做了很多测试,我不是100%确定,但我相信这是不够的。这改善了情况,但对我来说,解决pb问题的方法是使用报警管理器并从那里启动服务/BR。@heyalex您是否愿意对此进行调查?@BiswajitDas检查答案,让我知道它是否有效。@heyalex它有效。你救了我。仍然有一些小部件刷新问题是第一次出现,但它起作用了。@BiswajitDas很高兴看到它起作用了。你现在有什么问题?