Как я могу заставить мое приложение работать, даже если оно убито? убит в том смысле, когда его удаляют из последних приложений - PullRequest
0 голосов
/ 24 января 2020

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

Я видел много похожих вопросов, но ни один из них не сработал !! Любой, кто может мне помочь, пожалуйста, предоставьте фрагмент кода для вышеуказанного вопроса.

Даже убедитесь, что предоставленное вами растворенное вещество работает для Android O и выше

MainActivity. java

public class MainActivity extends AppCompatActivity {
MyReceiver myReceiver;
IntentFilter filter;

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

    myReceiver = new MyReceiver();
    filter = new IntentFilter(Intent.ACTION_USER_PRESENT);
    registerReceiver(myReceiver, filter);
}}

MyReceiver. java

public class MyReceiver extends BroadcastReceiver {
   private static final String TAG = "BroadCast Receiver";
   @Override
   public void onReceive(Context context, Intent intent) {
       if(intent.getAction().equals(Intent.ACTION_USER_PRESENT)){
          Toast.makeText(context, "DEVICE_IS_UNLOCKED",Toast.LENGTH_LONG).show();
          Log.i(TAG, "Unlocked");
       }
   }
}

Ответы [ 2 ]

1 голос
/ 24 января 2020

Запуск сервисов на переднем плане https://androidwave.com/foreground-service-android-example/?

0 голосов
/ 24 января 2020

Вам нужна работа в фоновом режиме.

Попробуйте следующий код.

public class BackgroundUpdateService extends Service {

    /**
     * Author:Hardik Talaviya
     * Date:  2019.08.3 2:30 PM
     * Describe:
     */

    private static final String TAG = "BackgroundLocation";
    private Context context;
    private boolean stopService = false;
    private Handler handler;
    private Runnable runnable;
    private NotificationCompat.Builder builder = null;
    private NotificationManager notificationManager;

    @Override
    public void onCreate() {
        Log.e(TAG, "Background Service onCreate :: ");
        super.onCreate();
        context = this;

        handler = new Handler();
        runnable = new Runnable() {

            @Override
            public void run() {
                try {
                    //Add Here your code if you want start in background
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    handler.postDelayed(this, TimeUnit.SECONDS.toMillis(2));
                }
            }
        };
        if (!stopService) {
            handler.postDelayed(runnable, TimeUnit.SECONDS.toMillis(2));
        }
    }

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

    @Override
    public void onTaskRemoved(Intent rootIntent) {
        super.onTaskRemoved(rootIntent);
        Log.e(TAG, "onTaskRemoved :: ");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e(TAG, "onStartCommand :: ");
        StartForeground();
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.e(TAG, "BackgroundService onDestroy :: ");
        stopService = true;
        if (handler != null) {
            handler.removeCallbacks(runnable);
        }
    }

    /*-------- For notification ----------*/
    private void StartForeground() {
        Intent intent = new Intent(context, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, PendingIntent.FLAG_ONE_SHOT);

        String CHANNEL_ID = "channel_location";
        String CHANNEL_NAME = "channel_location";

        notificationManager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT);
            channel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
            notificationManager.createNotificationChannel(channel);
            builder = new NotificationCompat.Builder(getApplicationContext(), CHANNEL_ID);
            builder.setColorized(false);
            builder.setChannelId(CHANNEL_ID);
            builder.setColor(ContextCompat.getColor(this, R.color.colorPrimaryDark));
            builder.setBadgeIconType(NotificationCompat.BADGE_ICON_NONE);
        } else {
            builder = new NotificationCompat.Builder(getApplicationContext(), CHANNEL_ID);
        }
        builder.setOnlyAlertOnce(true);
        builder.setContentTitle(context.getResources().getString(R.string.app_name));
        builder.setContentText("Your Text");
        Uri notificationSound = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_NOTIFICATION);
        builder.setSound(notificationSound);
        builder.setAutoCancel(true);
        builder.setSmallIcon(R.mipmap.ic_notification_app_icon);
        builder.setContentIntent(pendingIntent);
        startForeground(101, builder.build());
    }
}

Добавьте эту строку в Манифест

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

<service
    android:name=".BackgroundUpdateService"
    android:enabled="true" />

И Запустите и остановите сервис от вашей активности, используя следующий код

Intent someIntent = new Intent(MainActivity.this, BackgroundUpdateService.class);
startService(someIntent);//For start service
stopService(someIntent); //For stop service

Я надеюсь, что это может помочь Вам!

Спасибо.

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