当前位置: 首页 > 知识库问答 >
问题:

Oreo-小部件服务和广播接收器:不允许启动服务意图

莘昊
2023-03-14

我有一个监控wifi连接的小部件,所以我启动了一项服务来启动广播接收器来检测网络变化。除了我退出主应用程序外,一切都正常:服务停止。

因此,我在小部件中启动了一个报警管理器,它几乎每分钟都会唤醒一次,并检查主应用程序是否已退出。如果是这种情况,我尝试重新启动我的wifi监控服务,但这次它崩溃了,并显示以下消息

不允许开启服务Intent{cmp=包。CallbackNetworkWidgetService(有附加功能)}:应用程序在后台uid UidRecords{f6e65b9 u0a154 RCVR空闲更改:空闲|未缓存的程序: 1 seq(0,0,0)}

问题在于oreo新的意图/服务模型。直到牛轧糖。

问题:

>

我对前台/后台服务的概念有点迷茫。小部件是一个后台svce?wifi监控服务/BR也是后台svce?

这里有什么问题?

清单:

<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>

Callback WidgetNetworkService

@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);
}

Appwidget-startNetworkService

 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);
    }

共有1个答案

梁学真
2023-03-14

为此需要使用前台服务。

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);
   }
   //...
}
 类似资料:
  • 问题内容: 我目前正在使用在Oreo中崩溃的startWakefulService函数。我意识到我要么必须切换到startForegroundService()并使用前台服务,要么切换到JobIntentService,但是基于下面的代码,我不确定该怎么做。(对不起,我是android新手)。正确方向的任何观点将不胜感激。 这是在Android 8.x上运行时遇到的当前错误 致命异常:java.l

  • 这是在Android8.x上运行时出现的当前错误 致命异常:java.lang.RuntimeException无法启动接收方com.heyjude.heyjudeapp.gcm.gcmbroadcastreceiver:java.lang.illegalstateException:不允许启动服务意图{act=com.google.android.c2dm.Intent.receive flg=

  • 我的应用程序给出了一个错误,即不允许BroadcastReceiver组件绑定到服务。当短信到达时,我正在呼叫广播接收器,文本将转换为语音。我的接受者正确地呼叫。 但我的代码给出的错误如下 致命异常:主进程:texttospeech。tts。通用域名格式。tts,PID:12811 java。lang.RuntimeException:无法启动接收器texttospeech。tts。通用域名格式。

  • 问题内容: 我的应用程序具有服务和活动。在该服务中,使用以下代码调用活动: 即使没有标志,活动窗口也通常以正确的布局显示。但是,在具有Android 7的Xiaomi Redmi Note 4上,不会显示活动布局。我只在logcat上看到以下行: I /时间轴:时间轴:Activity_launch_request时间:281438674目的:目的{flg = 0x30000000 cmp = c

  • 每当它收到消息时,它都会在后台运行,即使应用程序没有运行,它也应该从后台启动活动