Как выйти из API, когда приложение очищено из стека, т.е. когда приложение переходит в состояние уничтожения в Android - PullRequest
0 голосов
/ 07 октября 2019

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

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

Без выбора опции выхода из системы пользователь очищает приложение, что означает уничтожение приложения. Как будет работать аутолог. Дайте мне решение.

Этот код, который я называю "метод взаимодействия с пользователем в общей деятельности"

public class MyApp1 extends Application {
    private LogOutListener1 listener;
    private Timer timer;
    private Context context;


    public void startUserSession(Context ctx) {
        this.context = ctx;
        long sessiontime = Prefs.getsessiontime(ctx);
        final long milliseconds = sessiontime * 60000;
        cancelTimer();
        timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                try {
                    boolean foreGround = new ForegroundCheckTask().execute(context).get();
                    if (foreGround) {
                        listener.onSessionLogout();
                    } else {
                        long millis = new Date().getTime();
                        Prefs.setcurrenttimestamp(context, millis);
                    }


                } catch (InterruptedException | ExecutionException ignored) {

                }
            }

        }, milliseconds);
    }

    public void cancelTimer() {
        if (timer != null) timer.cancel();
    }

    public void registerSessionListener(LogOutListener1 listener) {
        this.listener = listener;
    }

    public void onUserInteracted() {
        startUserSession(context);
    }

    private static class ForegroundCheckTask extends AsyncTask<Context, Void, Boolean> {

        @Override
        protected Boolean doInBackground(Context... params) {
            final Context context = params[0].getApplicationContext();
            return isAppOnForeground(context);
        }

        private boolean isAppOnForeground(Context context) {
            ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
            List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
            if (appProcesses == null) {
                return false;
            }
            final String packageName = context.getPackageName();
            for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
                if (appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND && appProcess.processName.equals(packageName)) {
                    return true;
                }
            }
            return false;
        }
    }

}

1 Ответ

0 голосов
/ 07 октября 2019

Может быть, это поможет вам

В соответствии с Google новый механизм LifecycleObserver поможет вам

Во-первых, добавьте это ниже зависимость от буксировки В Project ваше приложение
Во-первых, добавьте в project-level gradle

allprojects {
    repositories {
        google()
        jcenter()
        maven { url 'https://maven.google.com' }
    }
}

Затем после на уровне приложения gradle

implementation "android.arch.lifecycle:extensions:1.1.0"
implementation "androidx.lifecycle:lifecycle-extensions:2.0.0"

Затем после создания класса приложения и добавления нижеприведенной логики (Примечание: если вы уже создали, изменитеи добавьте ниже несколько методов)

public class MyApplication extends Application implements LifecycleObserver {


    String strPrafKey = "bi_vrnfX";
    String strKeyTime = "timeKey";
    private String strKeyLogin = "is_login";

    @Override
    public void onCreate() {
        super.onCreate();
        ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void onAppBackgrounded() {
        //App in background

        //Store app goes in background time
        SharedPreferences sharedpreferences = getSharedPreferences(strPrafKey, Context.MODE_PRIVATE);
        long currentTimeInSecond = Calendar.getInstance().getTimeInMillis() / 1000;
        sharedpreferences.edit().putLong(strKeyTime, currentTimeInSecond).apply();
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void onAppForegrounded() {
        // App in foreground

        SharedPreferences sharedpreferences = getSharedPreferences(strPrafKey, Context.MODE_PRIVATE);
        long lastBackgroundTime = sharedpreferences.getLong(strKeyTime, 0); //Take last background time for compare
        long currentTimeInSecond = Calendar.getInstance().getTimeInMillis() / 1000;
        long timeDeffrance = (currentTimeInSecond - lastBackgroundTime) / 60; //Diffrance of last background and current time in minute
        if (timeDeffrance > 5) {
            sharedpreferences.edit().putBoolean(strKeyLogin, false).apply();
            //You can replace this code or data with which you are comparing in your login
        }
    }
}

И, наконец, если вы не зарегистрировали этот класс в манифесте, зарегистрируйтесь, чтобы установить тег имени в вашем манифесте

<application
        android:name=".MyApplication"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...