Я пытаюсь запустить службу переднего плана в Android, но всякий раз, когда я запускаю свое приложение, приложение зависает и не показывает никаких уведомлений - PullRequest
1 голос
/ 11 июля 2019

Я создал канал уведомления В методе onCreate MapsActivity и вызвал метод startService для запуска службы.

Приложение остается замороженным, пока не закончится выполнение услуги

В logcat Ошибки, вызванные не упоминается. Я также упомянул использование FOREGROUND_SERVICE в ManifestFile

Основной класс

public class MapsActivity extends AppCompatActivity {
    public static final String CHANNEL_ID = "FenceCalculateChannel";
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
createNotificationChannel();
        Intent serviceIntent = new Intent(this,BackGroundDistanceCalculate.class);
        startService(serviceIntent);
}
public void createNotificationChannel() {
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            NotificationChannel serviceChannel = new NotificationChannel(CHANNEL_ID,
                    "Fence Service Channel",
                    NotificationManager.IMPORTANCE_DEFAULT);

            NotificationManager manager = getSystemService(NotificationManager.class);
            manager.createNotificationChannel(serviceChannel);
        }
    }
}

Класс обслуживания BackGroundDistanceCalculate

public class BackGroundDistanceCalculate extends Service {

    final public static String TAG = "BackGroundDistance";
    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        Intent notificationIntent = new Intent(this, MapsActivity.class);
        PendingIntent pendingIntent =
                PendingIntent.getActivity(this, 0, notificationIntent, 0);

        int i;

        for(i=0;i<1000;i++)
        {
            Log.d(TAG,"Value of i is : "+ i);
            SystemClock.sleep(1000);
        }

        Notification notification =
                new NotificationCompat.Builder(this, CHANNEL_ID)
                        .setContentTitle("Calculating Distance")
                        .setContentText("Distance Calculation is running")
                        .setSmallIcon(R.drawable.ic_favorite)
                        .setContentIntent(pendingIntent)
                        .build();

        //startForeground(1, notification);
        return START_NOT_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }


    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

Этот код должен создавать канал уведомлений при запуске приложения, но не работает. Какие изменения я могу сделать, чтобы запустить это приложение?

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Служба работает в основном потоке (поток пользовательского интерфейса) в соответствии с официальным документом, поэтому она заблокировала пользовательский интерфейс, поэтому ваше приложение зависло.

Вы должны использовать IntentService, в котором уже есть рабочий поток для запуска вашей работы.

Или вы можете вручную создать AsyncTask или Thread внутри вашего сервиса для обработки вашей работы.

0 голосов
/ 11 июля 2019

Я вижу две вещи, которые вы можете исправить, чтобы заставить его работать.

  1. Вы заставляете BackGroundDistanceCalculate переходить в спящий режим на 1000 секунд, что заставляет основной поток зависать на вас, когда экземпляры класса Service запускаются в основном потоке. Вы можете запустить новый поток или расширить его из IntentService (может не работать в Pie +, если не используется WorkManager)
  2. Вы можете попробовать запустить службу, используя ContextCompat.startForegroundService(), чтобы запустить службу, и изнутри службы вам придется опубликовать уведомление, прежде чем вы начнете делать свои вещи.
...