Как остановить службу переднего плана из уведомления в android? - PullRequest
1 голос
/ 29 мая 2020

Я использую службу переднего плана в своем приложении. Мне нужно остановить эту службу с помощью кнопки, которая присутствует в самом уведомлении, без открытия действия. Мой текущий код

Это мое действие, с которого я запускаю службу.

serviceIntent = new Intent(getApplicationContext(),BackgroundService.class);
        serviceIntent.putExtra("ip",ipAdd);
        serviceIntent.putExtra("token",token);
        serviceIntent.putExtra("port",portNo);
        serviceIntent.putExtra("resource",resourceId);
        serviceIntent.putExtra("userName",username);
        startService(serviceIntent);
        ClosingBackGroundService.getMainActivityContext(MainActivity.this);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                stopService(serviceIntent);
            }
        });

Я использую класс для отображения кнопки в уведомлении и пытаюсь закрыть действие

public class ClosingBackGroundService extends BroadcastReceiver {

   static Context mainActContext;
    public static void getMainActivityContext(Context context){
        mainActContext = context;
    }
    @Override
    public void onReceive(Context context, Intent intent) {
       mainActContext.stopService(MainActivity.serviceIntent);
        Log.i("Service","closed");
    }
}
 @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
       registerReceiver(broadcastReceiver, filter);
        Intent notificationIntent = new Intent(this,LoginActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this,0,notificationIntent,0);
        Intent closingIntent = new Intent(this,ClosingBackGroundService.class);
        PendingIntent actionIntent = PendingIntent.getBroadcast(this,0,closingIntent,PendingIntent.FLAG_UPDATE_CURRENT);
    Notification notification = new NotificationCompat.Builder(this,CHANNEL_ID)
            .setOngoing(true)
             .setSmallIcon(R.drawable.logo)
            .addAction(R.mipmap.ic_launcher,"Close Services",actionIntent)
            .setContentIntent(pendingIntent)
            .setAutoCancel(true)
            .setContentText("Processes Running In BackGround").build();
    ipAdd = intent.getStringExtra("ip");
    port = intent.getStringExtra("port");
    token = intent.getStringExtra("token");
    resourceId = intent.getIntExtra("resource",0);
    username = intent.getStringExtra("userName");
    runnableForGps.run();
    runnableForSendingGpsData.run();
    runnableForBluetooth.run();
    runnableForsendingBTData.run();
    startForeground(1,notification);

    return START_STICKY;
    }

Когда я нажимаю кнопку, уведомление исчезает, но процесс продолжает работать.

1 Ответ

0 голосов
/ 29 мая 2020

Вам не нужно создавать BroadCast, чтобы остановить Service. Попробуйте это

private static final String ACTION_STOP_LISTEN = "action_stop_listen";
Intent intent = new Intent(this, ClosingBackGroundService.class);
intent.setAction(ACTION_STOP_LISTEN);
PendingIntent actionIntent = PendingIntent.getService(this, 123, intent, PendingIntent.FLAG_UPDATE_CURRENT);
addAction(R.mipmap.ic_launcher,"Close Services",actionIntent)

В onStartCommand проверьте свое Intent действие

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
        if (intent != null && ACTION_STOP_LISTEN.equals(intent.getAction())) {
            stopForeground(true);
            stopSelf();
            return START_NOT_STICKY;
        }
        // your code
}
...