Modo de inicio de actividad, la pila de tareas y la propiedad taskAffinity

¿Cuál es la pila de tareas

Una aplicación al inicio, para tener mucha actividad, al pulsar el botón de retroceso, se caerá de nuevo en una actividad, entonces el sistema es cómo gestionar estas actividades es? La respuesta en forma de una pila (tarea), y siga los principios avanzaron a cabo, de forma predeterminada, una aplicación de pila es sólo una tarea (tarea), si es necesario, se puede especificar varias tareas pila (tarea). Podemos concluir lo siguiente:

1. La pila de tarea es una actividad de gestión de aplicaciones de contenedores, y seguir después del principio de avanzada
aplicación por defecto 2. Un sólo una pila tarea especificada por el sistema
3. Una aplicación puede tener múltiples tareas pila, tenemos que especificar su propio

La siguiente tarea apilar todas tarea llamada
Entonces, ¿cómo damos una actividad específica especificada tarea, especificando una tarea en particular ¿para qué sirve?
¿Quieres entender esto, tenemos que entender la actividad del modo de inicio. modo de la actividad de inicio de un total de cuatro, a saber, estándar, singleTop, singleTask, SingleInstance;

estándar:
Este es el modo por defecto de puesta en marcha, cada vez que inicia una actividad, se añadirá uno a uno a la tarea actual para ir. ¿Por qué es este momento, sabemos que una aplicación puede tener múltiples tareas, si hay dos tareas, a saber Taska y TaskB, TaskB no activityA, esta vez activityA inicio activityB, si activityB es el modo estándar, a continuación, poner activityB en lugar TaskB Taska. Hablando un poco enrevesado, mover sus manos pintar un cuadro se vuelve claro. También hay un pequeño problema, cuando comenzamos una actividad por lo general es un código como este:

    Intent i = new Intent(context,ActivityB.class);
    context.startActivity(i);

Con el tiempo startActivity, si el contexto es un applicationContext, y el modo de inicio ActivityB es estándar, entonces el sistema de error:

android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

Debido activityB en el intento de entrar en la tarea actual, he encontrado contexto (applicationContext) no pertenece a cualquier tarea, no puede entrar. La solución es crear una nueva tarea, el mensaje de error ha dejado muy claro, código específico es el siguiente:

    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

singleTop:
Como su nombre indica, si la actividad ha estado en la cima de la tarea, a continuación, cuando la actividad comenzó de nuevo, no va a ser re-creado, pero llamarlo onNewIntent (Intención i) método, los datos que desea transmitir, puede parámetros intención entrar, onCreate, onStart no se llama. Si esta actividad no se encuentra en la tarea superior, luego la actividad de los métodos de almacenamiento y estándar, como será re-creado, acumulada a la tarea.

singleTask:
la pila de modo de multiplexación. Si hay actividad en la tarea, y esta actividad es el modo singleTask, lanzar repetidamente de esta actividad no volverá a crear la instancia, pero el método de devolución de llamada onNewIntent (Intención i). Específicamente, cuando activityA como modo singleTask se activa, el sistema lo detectará, no hay tarea correspondiente, si no, crear una tarea, y luego poner en activityA. Si existe la tarea correspondiente, se comprobará si activityA parte superior de la pila, si la parte superior de la pila, el método directo onNewIntent llama, si no, a continuación, en la parte superior de toda la actividad activityA pop, y luego llamar al método onNewIntent.

SingleInstance:
Este modo de actividad, la tarea de una exclusiva, es decir, la tarea sólo puede tener ésta actividad. De inicio, creado para esta actividad será una tarea, y para impulsar esta actividad, si esta actividad se encuentra todavía en la pila cuando esta actividad comenzó de nuevo, no se llama método onCreate de esta actividad, pero las llamadas y onNewIntent método onStart.
Este patrón de escenario de uso es: suponiendo que hay un programa activo que permite a otros programas para llamar, si se quiere hacer de este programa y otros programas para compartir ejemplos de esta actividad, el uso de otro modo tres de inicio no funciona, ya que cada aplicación retorno tiene su propia pila, la pila cuando la pila en diferentes retorno de la misma actividad debe ser la creación de una nueva instancia. El modo de uso SingleInstance puede resolver este problema, en este modo, habrá una pila de retorno separado para gestionar este evento, independientemente de la aplicación para acceder a este evento, todos comparten la misma pila de retorno, sino también a resolver los casos de actividades compartidas problema.

Acerca del modo de cuatro promotores, básicamente explicar, pero cuando el caso de uso específico de múltiples tareas pila, pulse el botón de retroceso, fácil echar a perder, estamos aquí para hablar de paz. En primer lugar, dicha norma a seguir es: una pila de tiempo, dejar que la pila actual (primer plano pila) se vacía, vuelve pila vacía.

Por ejemplo:
Escribir imágenes describen aquí

En la aplicación, se inicia activityA, entonces activityA-> activityB-> activityC-> activityD,
si activityA, activityB y activityD son el modo estándar, activityC es el modo SingleInstance, esta vez en este momento hay dos tareas dentro de la aplicación (por el momento llamaron a la Taska y TaskB ). Que comprende además una tarea son como sigue:
Taska: activityA, activityB, activityD.
TaskB: activityC.
En este punto de la tarea de primer plano es Taska, el fondo es TaskB.
Pulse la tecla de retroceso cuatro veces, seguido de la destrucción es activityD-> activityB-> activityA-> activityC.
Sí así, después de la recepción de pila vacía, vuelve pila vacía.

propiedad taskAffinity detallada
pila tarea es tan básico, pero cuando queremos configurar manualmente la actividad a una tarea, y cómo hacerlo funcionar, que era hablar de una importante propiedad de:

android:taskAffinity

El documento oficial se explica de esta manera :

La tarea que la actividad tiene una afinidad por. Actividades con la misma afinidad conceptualmente pertenecen a la misma tarea (a la misma “aplicación” desde la perspectiva del usuario). La afinidad de una tarea está determinada por la afinidad de su actividad en las raíces.
La afinidad determina dos cosas - la tarea que la actividad es re-criaron a (véase el atributo allowTaskReparenting) y la tarea que albergará la actividad cuando se puso en marcha con la bandera FLAG_ACTIVITY_NEW_TASK.

Por defecto, todas las actividades en una aplicación tienen la misma afinidad. Puede configurar este atributo para agrupar de manera diferente, y las actividades en lugares incluso se define en diferentes aplicaciones dentro de la misma tarea. Para especificar que la actividad no tiene una afinidad para cualquier tarea, ponerlo en una cadena vacía.

Si este atributo no está establecido, la actividad hereda el conjunto afinidad por la aplicación (ver el <application> atributo taskAffinity del elemento). El nombre de la afinidad por defecto para una aplicación es el nombre del paquete conjunto por el elemento <manifest>.

Aquí está mi traducción, si es apropiado, por favor señalar:
tareas relacionadas taskAffinity pila de actividad. Tenemos la misma afinidad de la actividad pertenecen a la misma tarea en el concepto. La afinidad de una tarea depende de la actividad de las raíces taskaffinity en esta tarea. taskaffinity propiedad puede determinar dos cosas:
① cuando la actividad es re-padre, que iba a ser colocado en la pila qué tareas.
② Cuando se añade esta actividad FLAG_ACTIVITY_NEW_TASK marcar el inicio, que se colocará en la tarea.
Por defecto, la actividad de solicitudes, todos tienen la misma afinidad, puede establecer valores diferentes para el atributo taskaffinity agruparlos. Usted puede incluso poner aplicación múltiple de la actividad en la misma tarea en. Si desea borrar esta actividad no pertenece a cualquier tarea, esta propiedad se establece en carácter nulo puede ser.
Si esta propiedad no está definida, entonces el valor de esta propiedad heredará los valores de aplicación de esta propiedad (véase la solicitud de la propiedad taskaffinity). El nombre del paquete predeterminado es la aplicación.

Después de leer la interpretación oficial superior del documento, creo que usted tiene una comprensión de la propiedad taskAffinity, resumió el momento, hay dos aspectos: 1.taskAffinity atributo para la actividad se puede especificar la tarea, pero debe utilizar la marca FLAG_ACTIVITY_NEW_TASK. 2. El valor por defecto es taskAffinity el nombre del paquete de solicitud.

A continuación escribimos una demostración le mostrará:
Esto es lo que tengo que AndroidManifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="example.ylh.com" >

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <activity android:name=".MainActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".activityDemo.ActivityA"></activity>

        <activity android:name=".activityDemo.ActivityB"
            android:taskAffinity="example.ylh.com_new_task01"></activity>

        <activity android:name=".activityDemo.ActivityC"
            android:taskAffinity="example.ylh.com_new_task02"
            android:launchMode="singleTask"></activity>
    </application>
</manifest>

En el código anterior, un total de cuatro Actividad, la secuencia de inicio
MainAcitivity-> ActivityA-> ActivityB-> ActivityC
que ActivityC añadió singleTask modo de empezar, ya que la intención modo agregará se activa cuando singleTask
bandera FLAG_ACTIVITY_NEW_TASK.

ActivityA código:

package example.ylh.com.activityDemo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import example.ylh.com.R;

/**
 * Created by Administrator on 2017/8/4.
 */

public class ActivityA extends Activity {

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

        setContentView(R.layout.activity_test);

        TextView tv = (TextView) findViewById(R.id.textview);
        tv.setText("A");
        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(ActivityA.this,ActivityB.class);
                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(i);
            }
        });
    }
}

Código ActivieyB:

package example.ylh.com.activityDemo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import example.ylh.com.R;

/**
 * Created by Administrator on 2017/8/4.
 */

public class ActivityB extends Activity{

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

        setContentView(R.layout.activity_test);

        TextView tv = (TextView) findViewById(R.id.textview);
        tv.setText("B");
        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(ActivityB.this,ActivityC.class);
                startActivity(i);
            }
        });
    }

}

Después de la vuelta se inicia, desde ADB para ver sus detalles son los siguientes:
Escribir imágenes describen aquí

Podemos ver claramente, que contiene una pila de tres tareas:
primeros: nombre de pila: example.ylh.com, pila id: 8904, y contiene MainActivity ActivityA.
En segundo lugar: el nombre de pila: example.ylh.com_task01, pila id: 8905, incluidos ActivityB.
Tercero: nombre de pila: example.ylh.com_task02, pila id: 8906, incluidos ActivityC.
Resultados en línea con nuestras expectativas. Esto, se puede concluir que el uso de taskAffinity y FLAG_ACTIVITY_NEW_TASK (o singleTask), nuestra actividad se puede hacer para especificar la pila de tareas.

allowTaskReparenting atributo de
esta propiedad para explicar los puntos conflictivos, pero muy interesante.
API oficial explicó:

Sea o no la actividad puede pasar de la tarea que se inició a la tarea que tiene una afinidad por cuando dicha tarea se viene trajo al frente - “verdadero” si se puede mover, y “falso” si debe permanecer con la tarea donde comenzó.

Probablemente esto significa que, si se establece en "true", la actividad puede iniciarlo desde la tarea de mover a esta actividad y la tarea asociada. Estoy escuchando a esta explicación, todavía no entiende estimación,
dar un ejemplo: Hay dos aplicaciones A y B, la aplicación B tiene un activityC y activityC de la propiedad allowTaskReparenting es cierto. Ahora hay tal una escena, lanzó activityC B de A continuación, haga clic en el botón de inicio para volver al escritorio, inicie la aplicación B, este no es el momento para iniciar la aplicación mainActivity B, pero una vez más muestra activityC, activityC Una transferencia de la pila a la tarea la pila tarea B (porque activityC y la tarea asociada es AppB la tarea, por lo que el activityC añade a la parte superior de la pila).
A continuación se muestra un código específico:

Una aplicación de activityA:

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import example.ylh.com.R;

/**
 * Created by Administrator on 2017/8/4.
 */

public class ActivityA extends Activity {

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

        setContentView(R.layout.activity_test);

        TextView tv = (TextView) findViewById(R.id.textview);
        tv.setText("A");
        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent();
                i.setClassName("ylh.bsdf.com","ylh.bsdf.com.ActivityC");
                startActivity(i);
            }
        });
    }
}

Aplicación de activityC B:

package ylh.bsdf.com;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

/**
 * Created by Administrator on 2017/8/12.
 */

public class ActivityC extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tv = (TextView) findViewById(R.id.tv);
        tv.setText("app B activityC");
    }
}

Aplicación archivo AndoridManifest B:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="ylh.bsdf.com">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".ActivityC"
            android:allowTaskReparenting="true">
        </activity>
    </application>

</manifest>

De acuerdo con la parte superior de la lógica de arranque (activityA (APPA) -> activityC (APPB) -> Inicio-> APPB), la pila de ADB situación de impresión de la siguiente manera:
Escribir imágenes describen aquí
exactamente en línea con nuestras expectativas.
Benpian que termina aquí, de principio a fin, si usted debe entender muy completo, y donde no entiende las palabras para escribir una pequeña prueba de demostración (esto es importante).
Referencia:
"Los desarrolladores de Android para explorar el arte de"
documento oficial Android
http://blog.csdn.net/zhangjg_blog/article/details/10923643

Publicado 17 artículos originales · ganado elogios 12 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/qq_24295537/article/details/76559851
Recomendado
Clasificación