package com.antfortune.freeline.util; import android.app.Activity; import android.app.Application; import android.app.Application.ActivityLifecycleCallbacks; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.util.Log; import android.widget.Toast; import com.antfortune.freeline.FreelineCore; import com.antfortune.freeline.MiddlewareActivity; import java.util.ArrayList; import java.util.Map; import java.util.WeakHashMap; /** * Created by xianying on 16/3/16. */ public class ActivityManager { private static final String TAG = "Freeline.ActManager"; public static final int ACTIVITY_NONE = 0; public static final int ACTIVITY_CREATED = 1; public static final int ACTIVITY_STARTED = 2; public static final int ACTIVITY_RESUMED = 3; private static final WeakHashMap<Activity, Integer> sActivitiesRefs = new WeakHashMap(); private static long sFirstTaskId = 0L; private static final ActivityLifecycleCallbacks sLifecycleCallback = new Application.ActivityLifecycleCallbacks() { public void onActivityStopped(Activity activity) { sActivitiesRefs.put(activity, ACTIVITY_CREATED); } public void onActivityStarted(Activity activity) { sActivitiesRefs.put(activity, ACTIVITY_STARTED); } public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } public void onActivityResumed(Activity activity) { sActivitiesRefs.put(activity, ACTIVITY_RESUMED); } public void onActivityPaused(Activity activity) { sActivitiesRefs.put(activity, ACTIVITY_STARTED); } public void onActivityDestroyed(Activity activity) { sActivitiesRefs.remove(activity); } public void onActivityCreated(Activity activity, Bundle savedInstanceState) { sActivitiesRefs.put(activity, ACTIVITY_CREATED); if (sFirstTaskId == 0L) { sFirstTaskId = activity.getTaskId(); } } }; public static void initApplication(Application app) { app.registerActivityLifecycleCallbacks(sLifecycleCallback); } public static boolean restart(final Context context, boolean confirm) { Activity top = getTopActivity(); if(top instanceof MiddlewareActivity) { ((MiddlewareActivity)top).reset(); return true; } else { try { Intent e = new Intent(context, MiddlewareActivity.class); e.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); e.putExtra("reset", confirm); context.startActivity(e); return true; } catch (Exception exception) { final String str = "Fail to increment build, make sure you have <Activity android:name=\"" + MiddlewareActivity.class.getName() + "\"/> registered in AndroidManifest.xml"; Log.e(TAG, str); (new Handler(Looper.getMainLooper())).post(new Runnable() { public void run() { Toast.makeText(context, str, Toast.LENGTH_LONG).show(); } }); return false; } } } public static void restartCurrentActivity() { final Activity top = getTopActivity(); if(top instanceof Activity) { final Activity ac = (Activity)top; Intent i = ac.getIntent(); boolean rst = false; Log.i(TAG, "activity " + ac.getComponentName() + " has singleTask:" + rst); i.addFlags(65536); ac.overridePendingTransition(0, 0); ac.startActivity(i); (new Handler(Looper.getMainLooper())).postDelayed(new Runnable() { public void run() { Log.e(TAG, "first task id " + sFirstTaskId + " top actvitiy id " + ac.getTaskId()); Activity a = getTopActivity(); Log.e(TAG, "last top: " + top + " now top :" + a + " activity size :" + getAllActivities().length); if (a == ac) { ac.recreate(); Log.d(TAG, "restart :" + ac.getComponentName()); } else { ac.finish(); ac.overridePendingTransition(0, 0); Log.d(TAG, "finish :" + ac.getComponentName()); } } }, 200L); } } public static void restartForegroundActivity() { Activity foregroundActivity = Restarter.getForegroundActivity(FreelineCore.getApplication()); if (foregroundActivity != null) { Restarter.restartActivityOnUiThread(foregroundActivity); } } public static void restartActivity() { Activity[] activities = getAllActivities(); if(activities != null && activities.length > 0) { (new Handler(Looper.getMainLooper())).post(new Runnable() { public void run() { Exception err = null; // Activity top = getTopActivity(); Activity[] activities = getAllActivities(); for (Activity a : activities) { try { a.recreate(); Log.d(TAG, "restartActivity :" + a.getComponentName()); } catch (Exception exception) { err = exception; } } if (err != null) { throw new RuntimeException(err); } } }); } } public static Activity[] getAllActivities() { ArrayList<Activity> list = new ArrayList<>(); for (Map.Entry<Activity, Integer> e : sActivitiesRefs.entrySet()) { Activity a = e.getKey(); if (a != null && e.getValue().intValue() > 0) { list.add(a); } } return list.toArray(new Activity[list.size()]); } public static Activity getTopActivity() { Activity r = null; for (Map.Entry<Activity, Integer> e : sActivitiesRefs.entrySet()) { Activity a = e.getKey(); if (a != null && e.getValue().intValue() == ACTIVITY_RESUMED) { r = a; } } return r; } }