Я делаю приложение, которое имеет два вида деятельности, одно из которых является основным.Когда приложение запускается, оно создает службу переднего плана, которая регистрирует широковещательный приемник для намерения 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);
}