package com.qmusic; import java.util.Stack; import android.app.ActivityManager.RunningAppProcessInfo; import android.app.Application; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.os.Handler; import android.util.Log; import com.qmusic.common.BAppHelper; import com.qmusic.common.BLocationManager; import com.qmusic.common.BUser; import com.qmusic.dal.BDatabaseHelper; import com.qmusic.localplugin.PluginManager; import com.qmusic.notification.BNotification; import com.qmusic.service.BDataService; import com.qmusic.uitls.BLog; import com.qmusic.uitls.BUtilities; import com.qmusic.volley.QMusicRequestManager; import com.qmusic.webdoengine.BWebdoEngine; import com.umeng.analytics.MobclickAgent; public class MyApplication extends Application { public static final String TAG = MyApplication.class.getSimpleName(); public static boolean DEBUG; public static long STARTED_TIME; static Stack<String> foreground; static MyApplication instance; static Handler handler; @Override public void onCreate() { super.onCreate(); Log.i(TAG, "====Start " + getPackageName() + "===="); init(this); } @Override public void onTrimMemory(int level) { super.onTrimMemory(level); Log.w(TAG, "onTrimMemory:" + level); } @Override public void onLowMemory() { super.onLowMemory(); Log.w(TAG, "low memory"); } public static void init(MyApplication ctx) { STARTED_TIME = System.currentTimeMillis(); final ApplicationInfo appInfo = ctx.getApplicationInfo(); if ((appInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) == 0) { DEBUG = false; } else { DEBUG = true; } instance = ctx; BLog.setLevel(BLog.ALL); QMusicRequestManager.init(ctx); RunningAppProcessInfo appProcessInfo = BUtilities.getCurProcess(ctx); BLog.i(TAG, BUtilities.objToJsonString(appProcessInfo)); if (appProcessInfo != null) { BLog.i(TAG, "name:%s,pid:%d,uid:%d", appProcessInfo.processName, appProcessInfo.pid, appProcessInfo.uid); if (appInfo.packageName.equals(appProcessInfo.processName)) { // Note: UI component handler = new Handler(); foreground = new Stack<String>(); foreground.setSize(2); BAppHelper.init(ctx); BUser.init(); ctx.startService(new Intent(ctx, BDataService.class)); PluginManager.init(ctx); BLocationManager.init(ctx); BWebdoEngine.init(ctx); MobclickAgent.setDebugMode(DEBUG); MobclickAgent.updateOnlineConfig(ctx); MobclickAgent.setSessionContinueMillis(60 * 1000); } else { // Note:Other component for remote process } } else { BLog.e(TAG, "Should never get here"); } } public static final Context getContext() { return instance; } public static final void post(Runnable runnable) { handler.post(runnable); } public static final void removePost(Runnable runnable) { handler.removeCallbacks(runnable); } public static final void postDelayed(Runnable runnable, long delayMillis) { handler.postDelayed(runnable, delayMillis); } public static final void shutdown() { final Context ctx = getContext(); try { ctx.stopService(new Intent(ctx, BDataService.class)); BDatabaseHelper.closeDB(); BNotification.cancel(ctx); MobclickAgent.onKillProcess(ctx); } catch (Exception ex) { MobclickAgent.reportError(ctx, ex.getMessage()); ex.printStackTrace(); } long minutes = (System.currentTimeMillis() - STARTED_TIME) / 1000 / 60; Log.i(TAG, String.format("====End %s. Used %d minute(s)====", ctx.getString(R.string.app_name), minutes)); android.os.Process.killProcess(android.os.Process.myPid()); System.exit(0); } /** * should only be called from UI * * @param tag */ public static final void foreground(String tag) { if (foreground.size() == 0) { // Note: session start } BLog.v(TAG, "open:" + tag); foreground.push(tag); } /** * should only be called from UI * * @param tag */ public static final void background(String tag) { BLog.v(TAG, "close:" + tag); foreground.remove(tag); if (foreground.size() == 0) { // Note: session end } } /* * should only be called from UI. This method can't be called from the * onCreate or onStart of an activity * * @return current activity */ public static final String foreground() { if (foreground != null && foreground.size() > 0) { return foreground.peek(); } else { return null; } } }