Должен ли я использовать StartService или StartForegroundService для API> = 26? - PullRequest
0 голосов
/ 06 июня 2019

Я немного сбит с толку, потому что я читаю некоторые посты, где я тоже должен использовать ContextCompat.StartForegroundService();, если API> = 26.

Теперь я все еще просто использую StartService , и он работает, хотя я должен получить IllegalStateException для API> = 26 (текущий API на телефоне - 27) согласно этому посту.

https://medium.com/mindorks/mastering-android-service-of-2018-a4a1df5ed5a6

Я знаю, что Сервис это старая концепция. Позвольте мне заверить вас, что мы не будем обсуждать основы и узнаем о последних изменениях, внесенных в сервисный уровень в Android 8.0+, мы раскроем тайну знаменитых IllegalStateException и RemoteServiceException. Эта статья не является общепринятым способом понимания услуг, держитесь до тех пор, пока вы не сможете.

Таким образом, мой вопрос, должен ли я изменить startForeGroundService или просто оставить startService для API> = 26?

Мой класс, который обрабатывает мое служебное соединение:

/**This establishes the connection to the MediaPlayerService. */
public static ServiceConnection serviceConnection = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        MediaPlayerService.MusicBinder binder = (MediaPlayerService.MusicBinder)service;
        mediaPlayerService = binder.getService();
        mediaPlayerService.musicBound = true;
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        mediaPlayerService.musicBound = false;
    }
};

/**This is called to start the MediaPlayerService. */
private static Intent mediaPlayerServiceIntent = null;
public static void startMusicService(Context c) {

    /*mediaPlayerServiceIntent binds our connection to the MediaPlayerService. */
    mediaPlayerServiceIntent = new Intent(c, MediaPlayerService.class);
    c.bindService(mediaPlayerServiceIntent, serviceConnection, Context.BIND_AUTO_CREATE);
    c.startService(mediaPlayerServiceIntent);
    mServiceIsActive = true;
}

/**This is called to stop the MediaPlayerService. (onDestroy) */
public static void stopMusicService(Context c) {

    if (mediaPlayerServiceIntent == null)
        return;
    c.unbindService(serviceConnection);
    c.stopService(mediaPlayerServiceIntent);
    mediaPlayerServiceIntent = null;

    mediaPlayerService = null;
}

MainActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Main.startMusicService(getApplicationContext());

}

1 Ответ

0 голосов
/ 06 июня 2019

startService не будет работать для API> = 26

. С помощью следующего кода вы можете изменить свой сервис на основной.Это покажет уведомление.

private void runAsForeground(){
Intent notificationIntent = new Intent(this, MediaPlayerService.class);
PendingIntent pendingIntent=PendingIntent.getActivity(this, 0,
        notificationIntent, Intent.FLAG_ACTIVITY_NEW_TASK);

Notification notification=new NotificationCompat.Builder(this)
                            .setSmallIcon(R.drawable.ic_launcher)
                            .setContentText(getString(R.string.isRecording))
                            .setContentIntent(pendingIntent).build();

startForeground(NOTIFICATION_ID, notification);
}

для получения дополнительной информации - https://android -developers.googleblog.com / 2018/12 /ffective-foreground-services-on-android_11.html

https://developer.android.com/guide/components/services

другим способом (не рекомендуется .. целевой SDK должен быть не более 26)

public static void startService(Context context, Class className) {
    try {
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {
            Intent restartServiceIntent = new Intent(context, className);
            restartServiceIntent.setPackage(context.getPackageName());
            PendingIntent restartServicePendingIntent = PendingIntent.getService(context, 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT);
            AlarmManager alarmService = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
            if (alarmService != null) {
                alarmService.set(
                        AlarmManager.ELAPSED_REALTIME,
                        SystemClock.elapsedRealtime() + 500,
                        restartServicePendingIntent);
            }
        } else {
            Intent i = new Intent(context, className);
            context.startService(i);
        }
    } catch (Exception e) {
        MyLog.e(TAG, "startService: ", e);
    }
}

Позвонить по

 startService(context,MediaPlayerService.class);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...