vida studio samsung reiniciar rato prender porque pantalla moto congela como ciclo celular cada apaga activity actividad android

android - studio - porque se congela la pantalla de mi celular samsung



Forzar la aplicaciĆ³n para que se reinicie en la primera actividad (11)

Por alguna razón desconocida, no puedo hacer que mi aplicación salga correctamente para que cuando vuelva a presionar el botón de inicio y el ícono de la aplicación, reanude donde estaba en la aplicación. Me gustaría obligar a la aplicación a reiniciarse en la primera Actividad.

Supongo que esto tiene algo que ver con onDestroy () o tal vez con Pause () pero no sé qué hacer.


¿FLAG_ACTIVITY_CLEAR_TOP hace lo que necesita hacer?

Intent i = new Intent(getBaseContext(), YourActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(i);


Aquí hay un ejemplo para reiniciar su aplicación de forma genérica utilizando el PackageManager:

Intent i = getBaseContext().getPackageManager() .getLaunchIntentForPackage( getBaseContext().getPackageName() ); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(i);


Después de pensar y probar, finalmente conseguí la forma correcta de llamar a mi actividad para recrear cuando la aplicación se queda con el botón de inicio:

android:clearTaskOnLaunch

en el manifiesto

@Override public void onRestart(){ onCreate(); }

Eso funciona ... (mejor que cuando se coloca en Repetir, que se llama cada vez que inicias la aplicación, incluso la primera vez, lo que provoca una doble visualización)


El siguiente código es útil para mí, ¡puede reiniciar la aplicación completa a la perfección!

Intent mStartActivity = new Intent(context, StartActivity.class); int mPendingIntentId = 123456; PendingIntent mPendingIntent = PendingIntent.getActivity(context,mPendingIntentId, mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT); AlarmManager mgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent); System.exit(0);


La respuesta de Marc funciona muy bien, excepto en mi caso en que mi actividad principal tiene un launchMode de singleTop. Una vez que ejecuto este intento y luego navego a nuevas actividades y presiono el botón de inicio en el dispositivo, luego vuelvo a iniciar mi aplicación desde el icono de la aplicación, termino creando una nueva instancia de la actividad principal, con mi actividad anterior en la pila posterior .

Según esta pregunta , es porque los intentos no coinciden. En adb dumpsys activity , veo que desde mi lanzador android estándar, el paquete es nulo, mientras que cuando lo hago como sugiere Marc, el paquete de intención es el nombre de mi paquete. Esta diferencia hace que no coincidan y para iniciar una nueva instancia cuando el icono de la aplicación se toca nuevamente y la actividad principal no está en la parte superior.

Sin embargo, en otros lanzadores, como en Kindle, el paquete está configurado en el intento de iniciador, por lo que necesitaba una forma genérica para manejar los lanzadores. Agregué métodos estáticos como estos:

static boolean mIsLaunchIntentPackageNull = true; public static boolean isLaunchIntent(Intent i) { if (Intent.ACTION_MAIN.equals(i.getAction()) && i.getCategories() != null && i.getCategories().contains(Intent.CATEGORY_LAUNCHER)) { return true; } return false; } public static void handleLaunchIntent(Intent i) { if (isLaunchIntent(i)) { if (i.getPackage() != null) { mIsLaunchIntentPackageNull = false; } else { mIsLaunchIntentPackageNull = true; } } }

con un mecanismo de ir a casa como este:

Intent intentHome = appContext.getPackageManager() .getLaunchIntentForPackage( appContext.getPackageName()); intentHome.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // need to match launcher intent exactly to avoid duplicate activities in stack if (mIsLaunchIntentPackageNull) { intentHome.setPackage(null); } appContext.startActivity(intentHome);

luego, en la actividad principal definida en mi manifiesto, agregué esta línea:

public void onCreate(Bundle savedInstanceState) { [class from above].handleLaunchIntent(getIntent());

esto funciona para mí en kindle y mi teléfono, y me permite reiniciar correctamente la aplicación sin agregar otra instancia de la actividad principal.


La solución marcada como "respuesta" funciona pero tiene una desventaja que fue crítica para mí. Con FLAG_ACTIVITY_CLEAR_TOP, su actividad de destino aparecerá llamada Crear llamada antes de que su pila de actividad anterior reciba onDestroy. Mientras que he estado limpiando algunas cosas necesarias en ontroy tuve que trabajar en voz alta.

Esta es la solución que funcionó para mí:

public static void restart(Context context, int delay) { if (delay == 0) { delay = 1; } Log.e("", "restarting app"); Intent restartIntent = context.getPackageManager() .getLaunchIntentForPackage(context.getPackageName() ); PendingIntent intent = PendingIntent.getActivity( context, 0, restartIntent, Intent.FLAG_ACTIVITY_CLEAR_TOP); AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); manager.set(AlarmManager.RTC, System.currentTimeMillis() + delay, intent); System.exit(2); }

La idea es disparar un PendingIntent a través de AlarmManager que se invocará un poco más tarde, dando a la vieja pila de actividades algún tiempo para aclarar.


Puede utilizar el ProcessPhoenix Jake Wharton para reiniciar su proceso de solicitud.


esto funcionó para mí:

Intent mStartActivity = new Intent(ctx.getApplicationContext(), ActivityMain.class); mStartActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); mStartActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) mStartActivity.addFlags(0x8000); // equal to Intent.FLAG_ACTIVITY_CLEAR_TASK int mPendingIntentId = 123456; PendingIntent mPendingIntent = PendingIntent.getActivity(ctx, mPendingIntentId, mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT); AlarmManager mgr = (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE); mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, mPendingIntent); ActivityManager manager = (ActivityManager) ctx.getApplicationContext().getSystemService(ctx.getApplicationContext().ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> activityes = ((ActivityManager)manager).getRunningAppProcesses(); ((Activity)ctx).moveTaskToBack(true); manager.killBackgroundProcesses("com.yourpackagename"); System.exit(0);



FLAG_ACTIVITY_CLEAR_TOP no funcionó para mí porque tenía que admitir 2.3.3. Mi primera solución fue:

Intent intent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()); intent.addFlags(Build.VERSION.SDK_INT >= 11 ? Intent.FLAG_ACTIVITY_CLEAR_TASK : Intent.FLAG_ACTIVITY_CLEAR_TOP); context.startActivity(intent);

Esto casi funciona, pero no del todo.

Como tengo una actividad base, agregué una transmisión de muerte que cierra todas mis actividades de ejecución.

public abstract class BaseActivity extends AppCompatActivity { private static final String ACTION_KILL = "BaseActivity.action.kill"; private static final IntentFilter FILTER_KILL; static { FILTER_KILL = new IntentFilter(); FILTER_KILL.addAction(ACTION_KILL); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); registerReceiver(killReceiver, FILTER_KILL); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(killReceiver); } private final BroadcastReceiver killReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { finish(); } }; public void killApp(){ sendBroadcast(new Intent(ACTION_KILL)); } }

Todas mis actividades se extienden desde esta clase, por lo

((BaseActivity)getActivity()).killApp(); startActivity(new Intent(getActivity(), StartActivity.class));

reinicia la aplicación. Probado en genymotion v10, v16, v21 y Nexus 5 con v22.

Editar: esto no elimina una actividad si se destruye en el momento de enviar el intento. Todavía estoy buscando una solución.


android:clearTaskOnLaunch="true" android:launchMode="singleTask"

Use esta propiedad en el archivo de manifiesto en la clase inicial (primera actividad).