package com.gh.common.util; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.os.Parcelable; import android.text.TextUtils; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import com.gh.common.avoidcallback.AvoidOnResultManager; import com.gh.common.avoidcallback.Callback; import com.gh.gamecenter.BuildConfig; import com.gh.gamecenter.MainActivity; import com.gh.gamecenter.NormalActivity; import com.gh.gamecenter.SplashScreenActivity; import com.gh.gamecenter.normal.NormalFragment; import com.halo.assistant.HaloApp; import com.lightgame.utils.Utils; import org.json.JSONException; import org.json.JSONObject; import java.util.Iterator; import java.util.Set; /** * @author CsHeng * @Date 2017/4/25 * @Time 16:39 */ public class EntranceUtils { public static final String KEY_TO = "to"; public static final String KEY_NEXT_TO = "next_to"; public static final String KEY_NEWSID = "newsId"; public static final String KEY_GAMEID = "gameId"; public static final String KEY_GAME_ID = "game_id"; public static final String KEY_ID = "id"; public static final String KEY_URL = "url"; public static final String KEY_BUNDLE = "bundle"; public static final String KEY_GAMENAME = "gameName"; public static final String KEY_PACKAGE_MD5 = "package_md5"; public static final String HOST_ARTICLE = "article"; public static final String HOST_UPLOAD_VIDEO = "upload_video";//上传视频 public static final String HOST_UPLOAD_VIDEO_NEW = "upload_video_new"; // 上传视频新(AKA 发视频) public static final String HOST_VIDEO_SINGLE = "video_single";//指定视频-不能划动 public static final String HOST_VIDEO_MORE = "video_more";//指定视频-能划动 public static final String HOST_VIDEO_STREAMING_HOME = "video_streaming_home";//视频流-首页 public static final String HOST_VIDEO_STREAMING_DESC = "video_streaming_desc";//视频流-游戏介绍进入 public static final String HOST_VIDEO_COLLECTION = "video_collection";//视频合集 public static final String HOST_VIDEO_DETAIL = "video_detail"; public static final String HOST_USERHOME = "userhome";//个人主页 public static final String HOST_VIDEO = "video"; public static final String HOST_FORUM = "forum"; public static final String HOST_CATEGORY = "category";//分类 public static final String HOST_COLUMN_COLLECTION = "column_collection";//专题合集 public static final String HOST_COMMUNITY_QUESTION_LABEL_DETAIL = "community_question_label_detail";//问题标签详情 public static final String HOST_COMMUNITY_COLUMN_DETAIL = "community_column_detail";//专栏详情 public static final String HOST_BLOCK = "block";//板块 public static final String HOST_SERVER_BLOCK = "server";//开服表板块 public static final String HOST_AMWAY_BLOCK = "amway";//安利墙板块 public static final String HOST_GAME_CALENDAR = "game_calendar";// 指定游戏的开服表页面 public static final String HOST_HISTORY_APK = "history_apk"; // 历史版本页面 public static final String HOST_HELP = "help";//Q&A public static final String HOST_HELP_COLLECTION = "help_collection";//Q&A合集 public static final String HOST_GAME_UPLOAD = "game_upload";//游戏上传 public static final String HOST_GAME_ZONE = "game_zone";//游戏专区 public static final String HOST_COMMUNITY_ARTICLE = "community_article"; public static final String HOST_COMMUNITY_COLUMN = "community_column"; public static final String HOST_GAME = "game"; public static final String HOST_GAME_DOWNLOAD = "game_download"; public static final String HOST_GAME_NEWS = "game_news"; public static final String HOST_COLUMN = "column"; public static final String HOST_WEB = "web"; public static final String HOST_QQ = "qq"; public static final String HOST_QQ_GROUP = "qqgroup"; public static final String HOST_QQ_QUN = "qqqun"; public static final String HOST_DOWNLOAD = "download"; public static final String HOST_UPDATE = "update"; public static final String HOST_LINK = "link"; public static final String HOST_LIBAO = "libao"; public static final String HOST_COMMUNITY = "community"; public static final String HOST_SUGGESTION = "suggestion"; public static final String HOST_ANSWER = "answer"; public static final String HOST_QUESTION = "question"; public static final String HOST_TOOLBOX = "toolbox"; public static final String HOST_FORUM_DETAIL = "forum_detail"; public static final String HOST_GAME_RATING_DETAIL = "game_rating_detail"; public static final String HOST_HELP_AND_FEEDBACK = "help_and_feedback"; public static final String HOST_LAUNCH_SIMULATOR_GAME = "launch_simulator_game"; public static final String HOST_HELP_DETAIL = "help_detail"; public static final String HOST_GAME_COLLECTION_DETAIL = "game_collection_detail"; public static final String HOST_GAME_COLLECTION_SQUARE = "game_collection_square"; public static final String HOST_GAME_COLLECTION_EDIT = "game_collection_edit"; public static final String KEY_DATA = "data"; public static final String KEY_MESSAGE = "message"; public static final String KEY_MESSAGE_ID = "message_id"; public static final String KEY_TYPE = "type"; public static final String KEY_LINK = "link"; public static final String KEY_NAME = "name"; public static final String KEY_POSITION = "position"; public static final String KEY_SUB_POSITION = "sub_position"; public static final String KEY_ENTRANCE = "entrance"; public static final String KEY_ENTRANCE_LINK = "entrance_link"; public static final String KEY_TARGET = "target"; public static final String ENTRANCE_BROWSER = "(浏览器)"; public static final String ENTRANCE_WELCOME = "(启动弹窗)"; public static final String ENTRANCE_UMENG = "(友盟推送)"; public static final String ENTRANCE_MIPUSH = "(小米推送)"; public static final String ENTRANCE_DOWNLOAD = "(下载跳转)"; public static final String ENTRANCE_RECOMMEND = "(落地页)"; public static final String ENTRANCE_BLOCK_RECOMMEND = "(推荐入口)"; public static final String ENTRANCE_AMWAY = "(安利墙)"; public static final String KEY_SUGGEST_HINT_TYPE = "suggestHintType"; public static final String KEY_PACKAGENAME = "packageName"; public static final String KEY_PLATFORM = "platform"; public static final String KEY_GAME_NAME = "game_name"; public static final String KEY_VERSION = "version"; public static final String KEY_CONTENT = "content"; public static final String KEY_PLUGIN = "plugin"; public static final String KEY_LOCATION = "location"; public static final String KEY_CURRENTITEM = "currentItem"; public static final String KEY_COMMENTID = "commentId"; public static final String KEY_COMMENT_ID = "comment_id"; public static final String KEY_SHOW_KEYBOARD_IF_NEEDED = "show_key_board_if_needed"; public static final String KEY_PATH = "path"; public static final String KEY_LOCAL_PATH = "local_path"; public static final String KEY_OUTER_INFO = "outerInfo"; public static final String KEY_OLDERUSER = "isOldUser"; public static final String KEY_SEARCHKEY = "searchKey"; public static final String KEY_HINT = "hint"; public static final String KEY_GAME = "game"; public static final String KEY_GAME_ICON_URL = "gameIconUrl"; public static final String KEY_SHARECONTENT = "shareContent"; public static final String KEY_SUGGESTTYPE = "suggestType"; public static final String KEY_PROLIST = "provinceList"; public static final String KEY_ORDER = "order"; public static final String KEY_TAGTYPE = "tagType"; public static final String KEY_ANSWER_ID = "answerId"; public static final String KEY_ANSWER_CONTENT = "answerContent"; public static final String KEY_QUESTIONS_ID = "questionsId"; public static final String KEY_QUESTIONS_TITLE = "questionsTitle"; public static final String KEY_ANSWER_OPEN_IN_NEW_PAGE = "openInNewPage"; public static final String KEY_QUESTIONS_PATCH = "questionsPatch"; public static final String KEY_INVITE_SEARCH_KEY = "inviteSearchKey"; public static final String KEY_MESSAGE_TYPE = "messageType"; public static final String KEY_QUESTIONS_SEARCH_KEY = "questionsSearchKey"; public static final String KEY_SHOW_COMMENT = "showComment"; public static final String KEY_SHOW_ANSWER_COMMENT = "showAnswerComment"; public static final String KEY_RECOMMENDS_CONTENTS = "isRecommendsContents"; public static final String KEY_VERSION_UPDATE = "versionUpdate"; public static final String KEY_CHECK_QUESTION_CONCERN = "check_question_concern"; public static final String KEY_IS_COLUMN_COLLECTION = "is_column_collection";//是专题合集 public static final String KEY_DRAFT_ID = "draft_id"; public static final String KEY_KAIFU_LIST = "kaifuList"; public static final String KEY_CATEGORY = "category"; public static final String KEY_CATEGORY_ID = "category_id"; public static final String KEY_CATEGORY_TITLE = "category_title"; public static final String KEY_CATEGORY_INIT_TITLE = "category_init_title"; public static final String KEY_BLOCK_DATA = "blockData"; public static final String KEY_ASK_TAG = "askTag"; public static final String KEY_SCROLL_TO_LIBAO = "libao"; public static final String KEY_SCROLL_TO_SERVER = "scroll_to_server"; public static final String KEY_ASK_COLUMN_TAG = "askColumnTag"; public static final String KEY_COMMUNITY_ID = "community_id"; public static final String KEY_COMMUNITY_NAME = "community_name"; public static final String KEY_COMMUNITY_DATA = "communityData"; public static final String KEY_TRACE_EVENT = "trace_event"; public static final String KEY_SUBJECT_DATA = "subjectData"; public static final String KEY_SUBJECT_TYPE = "subjectType"; public static final String KEY_USER_ID = "user_id"; public static final String KEY_QUESTION_TAG = "question_tag"; public static final String KEY_COLUMN_ID = "column_id"; public static final String KEY_AUTO_DOWNLOAD = "auto_download"; public static final String KEY_HIDE_SUGGEST_HINT = "hide_suggest_hint"; public static final String KEY_HIDE_USELESS_INFO = "hide_useless_info"; public static final String KEY_COMMUNITY_ARTICLE_ID = "communityArticleId"; public static final String KEY_ARTICLE_COMMENT_ID = "articleCommentId"; public static final String KEY_SHOW_ARTICLE_COMMENT = "showArticleComment"; public static final String KEY_SCROLL_TO_COMMENT_AREA = "scroll_to_comment_area"; public static final String KEY_RATING_STAR_COUNT = "ratingStarCount"; public static final String KEY_QUESTION_MODERATOR_PATCH = "questionModeratorPatch"; public static final String KEY_SKIP_GAME_COMMENT = "skipGameComment"; public static final String KEY_OPEN_PLATFORM_WINDOW = "openPlatformWindow"; public static final String KEY_OPEN_KEYBOARD = "openKeyboard"; public static final String KEY_PATH_VIDEO = "pathVideo"; public static final String KEY_VIDEO_ID = "videoId"; public static final String KEY_DIRECT_COMMENT = "directComment"; public static final String KEY_SORT = "sort"; public static final String KEY_AMWAY = "amway"; public static final String KEY_SKIP_SUCCESS_PAGE = "skipSuccessPage"; public static final String KEY_COLLECTION_ID = "collectionId"; public static final String KEY_NAVIGATION_TITLE = "navigationTitle"; public static final String KEY_IMAGE_CROP_RATIO = "imageCropRatio"; public static final String KEY_OPEN_VIDEO_STREAMING = "openVideoStreaming"; public static final String KEY_REFERER = "referer"; public static final String KEY_UUID = "uuid"; public static final String KEY_IS_HOME_VIDEO = "isHomeVideo"; public static final String KEY_IS_HOME = "isHome"; public static final String KEY_TAB_COUNT = "tab_count"; public static final String KEY_WEB_SHARE = "webShare"; public static final String KEY_ACTIVITY_NAME = "activityName";//活动名称 public static final String KEY_PAGINATION_TYPE = "paginationType";//活动分页方式 public static final String KEY_REQUIRE_REDIRECT = "require_redirect"; // 标记需要再跳转 public static final String KEY_FIELD_ID = "field_id"; // 专区板块id public static final String KEY_SECTION_NAME = "section_name"; // 专区专题名 public static final String KEY_COLUMNNAME = "columnName"; public static final String KEY_QA_ID = "qaId"; public static final String KEY_QA_CONTENT_ID = "qaContentId"; public static final String KEY_QA_CATEGORY_NAME = "qaCategoryName"; public static final String KEY_QA_TITLE = "qa_title"; public static final String KEY_QA_COLLECTION_ID = "qaCollectionId"; public static final String KEY_SHOW_EDIT_DRAFT = "showEditDraft"; public static final String KEY_ARTICLE_OPEN_IN_NEW_PAGE = "openArticleInNewPage"; public static final String KEY_ONLY_CREATE_DRAFT = "onlyCreateDraft"; public static final String KEY_KAIFU_SELECT_TIME = "kaifuSelectTime"; public static final String KEY_POSTER_PATH = "posterPath"; public static final String KEY_BLACK_THEME = "blackTheme"; public static final String KEY_FROM_LOGIN = "fromLogin"; public static final String KEY_CHANGE_PHONE = "changePhone"; public static final String KEY_CONFLICT_PHONE = "conflictPhone"; public static final String KEY_CONFLICT_USER = "conflictUser"; public static final String KEY_EXPOSURE_SOURCE = "exposure_source"; public static final String KEY_BBS_ID = "bbs_id"; public static final String KEY_DIAGNOSIS = "diagnosis"; public static final String KEY_SIMULATOR = "simulator"; public static final String KEY_MARKET_DETAILS = "market_details"; public static final String KEY_CATALOG_ID = "catalogId"; public static final String KEY_PRIMARY_CATALOG_ID = "primaryCatalogId"; public static final String KEY_PRIMARY_CATALOG_NAME = "primaryCatalogName"; public static final String KEY_CATALOG_TITLE = "catalog_title"; public static final String KEY_CATALOG_INIT_TITLE = "catalog_init_title"; public static final String KEY_CATEGORY_LIST = "categoty_list"; public static final String KEY_IS_FREE = "is_free"; public static final String KEY_IS_SIGN = "is_sign"; public static final String KEY_IS_FORCED_TO_CERTIFICATE = "is_forced_to_certificate"; public static final String KEY_IS_FORCED_TO_CERTIFICATE_BUT_WITH_BACKDOOR = "is_forced_to_certificate_but_with_backdoor"; public static final String KEY_IS_CHOOSE_APK = "is_choose_apk"; public static final String KEY_TAB_INDEX = "tab_index"; public static final String KEY_IS_CATEGORY_V2 = "is_category_v2"; public static final String KEY_SUB_CATEGORY_ID = "sub_category_id"; public static final String KEY_IS_QA_FEEDBACK = "is_qa_feedback"; public static final String KEY_IS_CLICK_RECEIVE_BTN = "is_click_receive_btn"; public static final String KEY_SHOW_QUICK_LOGIN = "show_quick_login"; public static final String KEY_VIDEO_LIST = "video_list"; public static final String KEY_CHOOSE_FORUM_TYPE = "choose_forum_type"; public static final String KEY_CHOOSE_MAX_COUNT = "choose_max_count"; public static final String KEY_COMMENT_COUNT = "comment_count"; public static final String KEY_IS_COMMENT_CONVERSATION = "is_comment_conversation"; public static final String KEY_PARENT_TAG = "parent_tag"; public static final String KEY_BLOCK_ID = "block_id"; public static final String KEY_BLOCK_NAME = "block_name"; public static final String KEY_INSERT_GAME_COLLECTION = "insert_game_collection"; public static final String KEY_INSERT_BBS_VIDEO = "insert_bbs_video"; public static final String KEY_IS_FROM_SQUARE = "is_from_square"; public static final String KEY_FORUM_NAME = "forum_name";//版块名称 public static final String KEY_GAME_COLLECTION_TITLE = "game_collection_title";//游戏单标题 public static final String KEY_GAME_COLLECTION_ID = "game_collection_id";//游戏单ID public static final String KEY_ASSIST_RES = "assist_res"; public static final String KEY_LAST_SELECTED_POSITION = "last_selected_position"; public static final String KEY_RECOMMEND_ID = "recommend_id"; public static final String KEY_LAST_PAGE_DATA = "last_page_data"; public static void jumpActivity(Context context, Bundle bundle) { bundle.putBoolean(KEY_REQUIRE_REDIRECT, true); //TODO 把其他类似的跳转启动逻辑也处理掉 if (RunningUtils.isRunning(context) && MainActivity.class.getName().equals(RunningUtils.getBaseActivity(context))) { // 应用正在运行,前台或后台 String to = bundle.getString(KEY_TO); Class clazz = ClassUtils.forName(to); if (clazz == null) clazz = MainActivity.class; if (NormalFragment.class.isAssignableFrom(clazz)) { // 兼容NormalFragment NormalActivity.startFragmentNewTask(context, (Class) clazz, bundle); } else { Intent intent1 = new Intent(context, clazz); intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 如果 activity 名称有 singleton 的就添加 reorder_to_front 标签 (有点粗暴有点蠢,但暂时就先这样吧 :C ) if (clazz.getSimpleName().toLowerCase().contains("singleton")) { intent1.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); } intent1.putExtras(bundle); context.startActivity(intent1); } } else { // 应用未在运行 context.startActivity(SplashScreenActivity.getSplashScreenIntent(context, bundle)); } } public static void jumpActivity(Context context, Bundle nextToBundle, Bundle bundle, Callback callback) { bundle.putBoolean(KEY_REQUIRE_REDIRECT, true); //TODO 把其他类似的跳转启动逻辑也处理掉 if (RunningUtils.isRunning(context) && MainActivity.class.getName().equals(RunningUtils.getBaseActivity(context))) { // 应用正在运行,前台或后台 String to = bundle.getString(KEY_TO); Class clazz = ClassUtils.forName(to); if (clazz == null) clazz = MainActivity.class; if (NormalFragment.class.isAssignableFrom(clazz)) { // 兼容NormalFragment NormalActivity.startFragmentNewTask(context, (Class) clazz, bundle); } else { Intent intent1 = new Intent(context, clazz); //TODO:添加FLAG_ACTIVITY_NEW_TASK会导致一跳转页面callback就被调用 //intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent1.putExtras(bundle); AvoidOnResultManager.Companion.getInstance((AppCompatActivity) context) .startForResult(intent1, callback); } } else { // 应用未在运行 if (nextToBundle != null) { bundle.putBundle(KEY_NEXT_TO, nextToBundle); } context.startActivity(SplashScreenActivity.getSplashScreenIntent(context, bundle)); } } public static void saveShortcut(String activityName, @Nullable Bundle bundle) { if (BuildConfig.DEBUG) { if (activityName.contains("MainActivity")) { SPUtils.setString(EntranceUtils.KEY_BUNDLE, ""); return; } if (bundle == null) bundle = new Bundle(); try { JSONObject json = new JSONObject(); json.put(KEY_TO, activityName); json = getJsonFromBundle(bundle, json, null); Utils.toast(HaloApp.getInstance().getApplication(), "保存捷径成功"); SPUtils.setString(EntranceUtils.KEY_BUNDLE, json.toString()); } catch (Exception e) { e.printStackTrace(); SPUtils.setString(EntranceUtils.KEY_BUNDLE, ""); } } } /** * 将 Bundle 转为 Json */ private static JSONObject getJsonFromBundle(Bundle bundle, JSONObject json, @Nullable JSONObject bundleWrapper) throws JSONException { Set keys = bundle.keySet(); for (String key : keys) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Object object = bundle.get(key); if (object instanceof Bundle) { json = getJsonFromBundle((Bundle) object, json, new JSONObject()); } else if (object instanceof Parcelable) { String parcelableName = key + ":parcelable"; String parcelableType = object.getClass().getName(); String objectJsonString = GsonUtils.toJson(object); JSONObject jObject = null; jObject = new JSONObject(objectJsonString); if (bundleWrapper != null) { bundleWrapper.put(parcelableName, parcelableType); bundleWrapper.put(key, jObject); } else { json.put(parcelableName, parcelableType); json.put(key, jObject); } } else { if (bundleWrapper != null) { bundleWrapper.put(key, JSONObject.wrap(bundle.get(key))); } else { json.put(key, JSONObject.wrap(bundle.get(key))); } } } } if (bundleWrapper != null) { json.put(":bundle", bundleWrapper); } return json; } /** * 快捷地跳转到上次保存的页面 */ public static void jumpShortcut(Activity activity) { if (BuildConfig.DEBUG) { if (!hasShortcut()) return; Bundle bundle = new Bundle(); try { JSONObject jsonObject = new JSONObject(SPUtils.getString(EntranceUtils.KEY_BUNDLE)); getBundleFromJson(bundle, jsonObject, null); } catch (Exception e) { e.printStackTrace(); } jumpActivity(activity, bundle); } } /** * 从 JSON 里还原 Bundle */ private static void getBundleFromJson(Bundle bundle, JSONObject jsonObject, @Nullable Bundle bundleWithin) throws JSONException, ClassNotFoundException { Iterator iter = jsonObject.keys(); String parcelableName = ""; while (iter.hasNext()) { String key = (String) iter.next(); String value = jsonObject.getString(key); if (key.contains(":parcelable")) { parcelableName = value; } else if (key.contains(":bundle")) { getBundleFromJson(bundle, new JSONObject(value), new Bundle()); } else { if (bundleWithin != null) { if (!TextUtils.isEmpty(parcelableName)) { Class gClass = Class.forName(parcelableName); bundleWithin.putParcelable(key, ((Parcelable) GsonUtils.fromJson(value, gClass))); } else { bundleWithin.putString(key, value); } // TODO 支持多层 bundle 嵌套 // TODO 直接用 GSON 提供的 Bundle Adapter https://github.com/google-gson/typeadapters/blob/master/android/src/main/java/BundleTypeAdapterFactory.java if (!bundle.containsKey("normalFragmentBundle")) { bundle.putBundle("normalFragmentBundle", bundleWithin); } } else { if (!TextUtils.isEmpty(parcelableName)) { Class gClass = Class.forName(parcelableName); bundle.putParcelable(key, ((Parcelable) GsonUtils.fromJson(value, gClass))); } else { bundle.putString(key, value); } } } } } public static boolean hasShortcut() { return !TextUtils.isEmpty(SPUtils.getString(EntranceUtils.KEY_BUNDLE)); } }