Pregunta

estoy desarrollando una aplicación con numerosas actividades. Me gustaría crear una notificación persistente que (más o menos) dice: "AppName - Volver a AppName" que estará presente siempre que mis servicios en segundo plano se están ejecutando. Creación y eliminación de la notificación no fue problema.

Ahora, el usuario podría estar en cualquiera de las diversas pantallas / Actividades, salir de la aplicación, a continuación, desea volver a entrar en la aplicación a través de la notificación. El problema es , la notificación debe tener una intención, que pone en marcha un Actividad predeterminado . Quiero que la notificación a volver a entrar en la aplicación en cualquier actividad que está en la parte superior de la pila de la historia .

Mi primer intento de una solución fea era hacer una actividad (llamémoslo "returnFromNotify") cuyo único trabajo era "terminar" suyo en la tierra de "onCreate". La notificación se abriría "returnFromNotify" en el ámbito de la historia de las aplicaciones, lo que inmediatamente eliminar en sí, el envío de la parte posterior del usuario al estado anterior de la historia de la pila de aplicaciones. Esto parece funcionar ... a menos que el usuario ha utilizado "atrás" para respaldar completamente fuera de la aplicación. Luego, cuando llegan a la notificación, cargas "returnFromNotify", a continuación, acabados, enviándolos de vuelta a la pantalla de inicio (ya que no hay actividades en la pila del historial de la aplicación).

consideré intentar detectar si había algo en la pila antes de la historia "returnFromNotify", y si no, el fuego de mi actividad principal. Parece que no puedo encontrar una manera de hacer esto, tampoco.

Cualquier entrada o sugerencias para un novato Java / Android? Para su información, Mi historia principal es con lenguajes basados ??en scripts.

¿Fue útil?

Solución

I como su idea original de crear una actividad "returnFromNotify" mejor que su solución propuesta, ya que es posible detectar si el ResumeActivity es en la parte inferior de la pila (y por lo tanto la única actividad en la pila).

Así es como puede hacerlo:

Agregar ResumeActivity al manifiesto y especifique el atributo href="http://developer.android.com/guide/topics/manifest/activity-element.html#nohist"> noHistory

<activity android:name=".ResumeActivity" android:noHistory="true" />

Especificación de noHistory se asegurará de que esta actividad no se quedará en la pila tan pronto como se termina. De esta manera usted sabe que sólo una instancia actualmente en ejecución de la ResumeActivity se mostrará en la pila.

Con el fin de comprobar la pila de aplicaciones, usted también tiene que pedir el permiso GET_TASKS:

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

Ahora puede utilizar ActivityManager :: getRunningTasks () a determinar si ResumeActivity es la única actividad en la pila:

public class ResumeActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if(isOnlyActivityInStack()) { //check the application stack
            //This activity is the only activity in the application stack, so we need to launch the main activity
            Intent main = new Intent(this, MainActivity.class);
            main.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(main);
        } else {
            //Return the user to the last activity they had open
            this.finish();
        }
    }

    /**
     * Checks the currently running tasks. If this activity is the base activity, we know it's the only activity in the stack
     *
     * @return  boolean  This activity is the only activity in the stack?
     **/
    private boolean isOnlyActivityInStack() {
        ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        boolean onlyActivityInStack = false;

        for(RunningTaskInfo tasks : manager.getRunningTasks(Integer.MAX_VALUE)) {
            if(tasks.baseActivity.getPackageName().equals(this.getPackageName())) { //find this package's application stack
                if(tasks.baseActivity.getClassName().equals(this.getClass().getName())) {
                    //If the ResumeActivity is the base activity, we know that it is the only activity in the stack
                    onlyActivityInStack = true;
                    break;
                }
            }
        }

        return onlyActivityInStack;
    }

}

Sé que esta pregunta hace más de 2 años, pero estoy proporcionando esta respuesta en caso de que alguien se ejecuta en otro lugar a esta situación en particular (como yo). Creo que estaban en el camino correcto con la solución que estaba trabajando originalmente hacia.

Otros consejos

De acuerdo, creo que he encontrado una solución alternativa satisfactoria para mi caso específico . He añadido un número entero estática a mi "mainActivity", y cada vez es "onCreate" se dispara, se incrementa el número entero. Cada vez que se disparó de "OnDestroy", se decrementa.

En mi "returnFromNotify", miro el número entero estática para ver si es mayor que 0. Si es así, supongo que hay un activo "mainActivity", y que la ejecución de "terminar" dentro "returnFromNotify" volveré allí . De lo contrario, se asume que los usuarios han "respaldado" fuera, termina en sí, a continuación, utiliza "startActivity" para encender una nueva instancia de "mainActivity".

Esto no es una solución universal, pero para mis propósitos, creo que va a ser suficiente. Todavía estoy abierto a otras respuestas, y si alguien puede perforar un agujero en mi lógica, por favor, hágalo - constructiva críticas son bienvenidos . Gracias.

Creo que no hay una manera fácil de hacer esto, pero en lugar de añadir un contador en la mainActivity Me gustaría extender Aplicación :

  

Clase base para aquellos que necesitan   mantener el estado de aplicación global. Tú   puede proporcionar su propia implementación de   especificando su nombre en su   AndroidManifest.xml de   etiqueta, lo que hará que la clase sea   instancia para que cuando el proceso   para su aplicación / paquete es   creado.

Me gustaría mantener la máxima la lógica allí y tener un método como:

public Intent getIntentForLastActivityShown();

que se llamará cuando se hace clic en el elemento de notificación.

Mi primer enfoque sería utilizar SharedPreferences y almacenar un par de valores clave llamada algo así como lastDisplayedActivity. Luego, en onResume de cada actividad (y posiblemente `onCreate ') que tendría una línea como esta:

sharedPreferences.edit().putInteger("lastDisplayedActivity", ReturnFromNotify.THIS_ACTIVITY_NAME);

En otras palabras, se almacena una variable de amplia aplicación que indica qué actividad se mostró por última vez. A continuación, sólo agarrar esta variable a partir SharedPreferences y poner en marcha la actividad correspondiente.

Por lo general utilizan actividad denominada "Launcher" que comprueba el estado de mi solicitud actividades modelo y comienza (o hace otras cosas) en función de las reglas modelo. Pongo Modelo objeto en mi clase de aplicaciones. Modelo puede utilizar Preferencias para almacenar su estado. Lo hago para evitar que los campos estáticos en las actividades.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top