Как всегда начинать с активности запуска на Android?

Существует три разных случая:

1) Пользователь запускает приложение, перемещается в него, нажимает на него и снова нажимает значок приложения, чтобы снова запустить наше приложение.

2) Пользователь запускает приложение, перемещается в нем, нажимает на него, выбирает последние и нажимает на приложение, чтобы снова запустить наше приложение.

3) Пользователь запускает приложение, перемещается в нем, щелкает что-то в приложении (TextView со ссылкой), которое вызывает другое приложение (как пример электронной почты), а пользователь нажимает кнопку "Назад", которая возвращает нас в наше приложение.

Я знаю флаг флага "clearTaskOnLaunch", он решает вопрос № 1.

Я знаю о флаге "excludeFromRecents", он решает вопрос № 2 (может быть, это не самое удобное для пользователя решение, но оно работает).

Как насчет случая №3? У меня есть обходное решение прямо сейчас. Тем не менее, мне придется поместить его на все действия, которые могут привести к другому приложению. Интересно, есть ли лучший способ решить эту проблему (без обработки во всех таких действиях).

Ответ 1

Это должно обрабатываться на уровне приложения.

Для уровня API 14 вы можете зарегистрировать ActivityLifeCycleCallback в своем классе приложений

public void registerActivityLifecycleCallbacks (Application.ActivityLifecycleCallbacks callback)

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

Если вы нацеливаете версии SDK < 14, вы должны реализовать свой собственный метод, знать, какие действия создаются/возобновляются и приостанавливаются, и делать то же самое всякий раз, когда действие приостанавливается, без создания/возобновления нового действия.

Ответ 2

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

EDIT: Вместо того, чтобы использовать кнопку, вы можете использовать логическое значение, чтобы определить, нужно ли вам сворачивать обратно в основное действие. Ваша корневая активность распространяется на активность, а дочерние действия распространяются от CollapsableActivity. Чтобы заставить это работать во всех случаях, я добавил startOutsideActivity() и startOutsideActivityForResult().

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class CollapsableActivity extends Activity {
    private boolean returnToRoot;
    public static final int COLLAPSE_BACK = -1; // something other than RESULT_CANEL (0)

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        returnToRoot = true;
    }

    @Override
    protected void onStart() {
        super.onStart();
        returnToRoot = true;
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        // start collapsing the stack
        if (returnToRoot) {
            setResult(COLLAPSE_BACK);

            finish();
        }
    }

    @Override
    public void startActivityForResult(Intent intent, int requestCode) {
        super.startActivityForResult(intent, requestCode);
        returnToRoot = false;
    }

    public void startOutsideActivityForResult(Intent intent, int requestCode) {
        super.startActivityForResult(intent, requestCode);
        returnToRoot = true;
    }

    @Override
    public void startActivity(Intent intent) {
        // call startActivityForResult to make sure and catch the collapse condition
        super.startActivityForResult(intent, 0);   
        returnToRoot = false;
    }

    public void startOutsideActivity(Intent intent) {
        super.startActivity(intent);    
        returnToRoot = true;
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode == COLLAPSE_BACK) {
            returnToRoot = true;
        }
   }
}

Это работало правильно для меня во всех перечисленных вами случаях. Единственное различие - вам нужно вызвать startOutsideActivity() или startOutsideActivityForResult(), когда вы перемещаетесь от своего приложения. Лично я считаю, что это добавляет ясности в ваши намерения. Надеюсь, это поможет!

Ответ 3

1) определить переменную public static normalPause = true в классе.

2) в методе onPause всех ваших действий установите false (я беспокоюсь. Возможно, мы не находимся в нормальной паузе)

2) в onCreate методе всех ваших действий установите его true (не волнуйтесь. Мы находимся в нормальной паузе)

3) в onResume всех ваших действий:

if(!Utilities.normalPause)
{
    this.finish()
}

Наслаждайтесь!

Ответ 4

Я знаю, что вы не хотите управлять им во всех видах деятельности, но вы можете это сделать, а все еще обрабатывать код в одном месте с помощью супер-активности

public abstract class BlundellActivity extends Activity {
     @Override
     public void onPause(){
         // Whatever strategy you want
     }
}

public class SomeActivity extends BlundellActivity {
     // Do whatever you normally want to do
}

public class SomeActivity extends BlundellActivity {
     // Do whatever you normally want to do here as well
}

Ответ 5

Возможно, android:noHistory - это то, что вы ищете. Если вы объявите все свои действия, кроме StartupActivity с этим атрибутом, они будут завершены, когда пользователь перейдет от них, и появится только StartupActivity.

Ответ 6

Вы можете выполнить следующие действия:

  • используйте один boolean статический флаг isFinish в StartupActivity со значением false по умолчанию.
  • в onCreate() StartupActivity установите isFinish значение false.
  • напишите ниже код в методе onResume() всех действий в вашем проекте.

    if(isFinish)
    {
       finish();
    }
    
  • установите isFinish значение true при открытии любого родного приложения, такого как электронная почта, браузер и т.д.

или

5. установите значение isFinish в значение true в методе onBackPress(), когда вы хотите закрыть приложение при обратном нажатии.

Случай 6: если браузер Android открыт при нажатии на любую ссылку, используйте ниже код onPause() method

if(isBrowserRunning("com.android.browser"))
{
   isFinish = true;
    finish();
}

////////////////

 private boolean isBrowserRunning(String processName)
        {
            ActivityManager manager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
            String packageName = manager.getRunningTasks(1).get(0).topActivity.getPackageName();
            Log.i("LogTest", "Current process package name: " + packageName);

            return processName.equalsIgnoreCase(packageName); 
        }

Вы можете создать образец проекта, чтобы узнать другое имя пакета браузера, например, opera mini, браузер US и т.д.

добавьте ниже разрешение в манифест:

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

Ответ 7

Вы можете вызвать this.finish() на onPause() вашего Activity, таким образом, действие будет закрыто в трех случаях.

Ответ 8

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

Отметьте этот ответ:

fooobar.com/questions/372909/...

При использовании Broadcast и BroadcastReceivers в каждом действии вашего приложения вы можете убивать все действия, когда ваше приложение переходит в фоновый режим.

UPDATE

Чтобы определить, можно ли использовать приложение на фоне, вы можете использовать onStop, проверьте это, чтобы понять теорию: Жизненный цикл активности бок о бок

И это реализация: fooobar.com/questions/26541/...

Я думаю, что это все, что вам нужно: -)

Ответ 9

Вам нужно использовать пакет и передать соответствующий параметр/или параметры из вызывающего приложения (т.е. щелкнуть что-то в приложении (TextView со ссылкой)).

Получить параметр в вызываемом приложении (приложение электронной почты).

Вы можете отправить имя активности в параметре.

Теперь, находясь в приложении электронной почты (вызываемое приложение) Нажмите кнопку "Назад", вернитесь к вызывающему приложению.

При желании вы можете сохранить состояние активности из программы вызывающего абонента, если требуется.

Вам нужно использовать Bundle и Intent для реализации этой логики.

Фрагмент кода:

В вызывающей программе нам нужно сохранить параметры/данные, необходимые для функции кнопки "Назад" в вызываемой программе.

Bundle bndleData = new Bundle(); Используйте методы putString(), putInt() класса Bundle.

    String prefix = getPackageName().toString();
           (this prefix can be stored in application level constants.java file as applicable)

    bndleData.putString("ParentActivity", this.getLocalClassName());

Также, если необходимо, добавьте дополнительные параметры       bndleData.putString( "paramName", valueofParamName);       bndleData.putInt( "IntChannelImage", chImageInt);

    Intent intent = new Intent(v.getContext(), AMRChannelPlayer.class);

    intent.putExtra(prefix + "bndleChnlData", bndleData);

    startActivity(intent);

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

prefix = getPackageName(). toString(); Bundle extras = getIntent(). GetBundleExtra (prefix + "bndleData" );

Строка parentActivity = extras.getString( "ParentActivity" ); extras.getString( "ParamName" );

Надеюсь, это поможет вам.