Служба Foreground не работает на Oreo (Android 8.1.0) - PullRequest
0 голосов
/ 31 мая 2019

Я делаю приложение, которое имеет два вида деятельности, одно из которых является основным.Когда приложение запускается, оно создает службу переднего плана, которая регистрирует широковещательный приемник для намерения USER_PRESENT.Когда слушатель вещания получает вещание, он запускает второе действие.Я столкнулся с двумя проблемами с моим кодом: 1) Уведомление службы переднего плана не приходит.Однако служба работает.2) Слушатель вещания работает нормально, когда мое приложение является активным приложением на телефоне.Но слушатель вещания не работает, если мое приложение находится в фоновом режиме.Но служба работает, потому что в журналах есть сообщения о том, что она была убита / остановлена.

Как исправить эти две проблемы?

Я запускаю приложение на телефоне Oppo CPH1859 с Android 8.1.0

Android.manifest +++++++++++++

<uses-sdk android:minSdkVersion="26" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <service
        android:name=".MyFGService"
        android:enabled="true"
        android:exported="true"></service>

    <activity
        android:name=".DisplayMessageActivity"
        android:parentActivityName=".MainActivity">

        <!-- The meta-data tag is required if you support API level 15 and lower -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".MainActivity" />
    </activity>
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

+++++

В основной деятельности

@Override
protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 Log.v("FIRST APP","Main activity started");
 myService = new Intent(MainActivity.this, MyFGService.class);
 startService(myService);
}

@Override
public void onDestroy() {
    stopService(myService);
    Log.v("FIRST APP","Main activity destroyed");
    super.onDestroy();
}

++++++++++++

В MyFGService

public int onStartCommand(Intent intent, int flags, int startId) {
    Toast.makeText(this, "service (re)starting", Toast.LENGTH_SHORT).show();
    Log.v("FIRST APP", "Service (re)starting");
    // If we get killed, after returning from here, restart
    return START_STICKY;
}

private String createNotificationChannel() {
    // Create the NotificationChannel, but only on API 26+ because
    // the NotificationChannel class is new and not in the support library
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        CharSequence name = "TEST Name";
        String description = "TEST Description";
        int importance = NotificationManager.IMPORTANCE_DEFAULT;
        NotificationChannel channel = new NotificationChannel( "FirstAppNotifChannel", name, importance);
        channel.setDescription(description);
        // Register the channel with the system; you can't change the importance
        // or other notification behaviors after this
        NotificationManager notificationManager = getSystemService(NotificationManager.class);
        notificationManager.createNotificationChannel(channel);
        return channel.getId();
    }
    return null;
}

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

    Log.v("FIRST APP", "Service created");

    Intent notificationIntent = new Intent(this, MainActivity.class);
    PendingIntent pendingIntent =
            PendingIntent.getActivity(this, 0, notificationIntent, 0);
    String notificationChannelID = createNotificationChannel();
    Log.v("FIRST APP","notification channel ID =" + notificationChannelID);
    Notification myNotification = new Notification.Builder(this, notificationChannelID)
                    .setContentTitle("TEST Title")
                    .setContentText("TEST Content")
                    .setContentIntent(pendingIntent)
                    .build();

    startForeground(101, myNotification);

    IntentFilter filter = new IntentFilter();
    filter.addAction(Intent.ACTION_USER_PRESENT);
    registerReceiver(mReciever, filter);
}


@Override
public void onDestroy() {
    Toast.makeText(this, "service destroyed", Toast.LENGTH_SHORT).show();
    Log.v("FIRST APP", "Service destroyed");
    unregisterReceiver(mReciever);
}
...