Android开发之第三方跳转
2015-12-10 15:56
585 查看
接收端逻辑
1.首先添加action
如下所示 代码:<activity android:name="com.helios.activity.StartActivity" android:label="@string/app_name" android:launchMode="singleTask" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <action android:name="applicationname.action.applaunch"/>(此处可更改) <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
2.onCreate方法增加逻辑
在启动activity(此处为StartActivity)的onCreate方法中super.onCreate之前添加跳转逻辑处理。类似下约:protected void onCreate(Bundle savedInstanceState) { LogHelper.releaseLog("StartActivity", "StartActivity init"); // add Third party jump Intent intent = getIntent(); if(null != intent){ startThirdJump(intent,savedInstanceState); } super.onCreate(savedInstanceState); setContentView(R.layout.activity_start);}
3.跳转原理及方法处理
跳转原理即:第三方跳转入口处(请求发送端),提供跳转页面ID,以及跳转参数信息Map。在接受跳转的apk(请求接收端)中处理。根据相应的页面ID和参数信息Map启动相应的页面即可。startThirdJump方法:
private void startThirdJump(Intent intent, Bundle savedInstanceState){ Bundle extraBundle = intent.getExtras(); if(null != extraBundle && extraBundle.containsKey("Data")){ String extraString = extraBundle.getString("Data"); LogHelper.releaseLog("StartActivity", "extraString:"+extraString); parseExtraJump(extraString); super.onCreate(savedInstanceState); setContentView(R.layout.activity_start); setExtraJump(); } }parseExtraJump方法:根据从Bundle中获取的字符串,解析出相应的页面ID和参数Map
private void parseExtraJump(String info){ if(mExtraJumpParser==null){ mExtraJumpParser = new ExtraJumpParser(); } mExtraJumpParser.mParseData = info; mExtraJumpParser.run(); }此处是利用一个Parser来解析的,其实完全可以在主线程中新开一个方法来解析。或提供Helper帮助类来解析。
ExtraJumpParser类参考(部分代码如下:)
public class ExtraJumpParser extends BaseParser{ private KEY_PAGEID mPageID = null; private Map<String, Object> mJumpMap = null; public KEY_PAGEID getExtraPageID(){ return mPageID; } @Override public void run() { parseExtraJump(); } private void parseExtraJump(){ mPageID = null; String[] paramsStrings = mParseData.split("&"); String[] params; mJumpMap = new HashMap<String, Object>(); for(int i=0;i<paramsStrings.length;i++){ params = paramsStrings[i].split("="); if(params.length<=1){ continue; } if(params[0].equals("page")){ mPageID = getChangePageMode(params[1]); } else{ mJumpMap.put(params[0], params[1]); } } } /** * 获取跳转页面模式 */ private KEY_PAGEID getChangePageMode(String page) { KEY_PAGEID pageID = null; if(page.equals("detail")){ pageID = KEY_PAGEID.PAGE_DETAIL; } else if(page.equals("eventdetail")){ pageID = KEY_PAGEID.PAGE_EVENTDETAIL; } else if(page.equals("play")){ pageID = KEY_PAGEID.PAGE_PLAY; } else if(page.equals("live")){ pageID = KEY_PAGEID.PAGE_LIVE; } else if(page.equals("league")){ pageID = KEY_PAGEID.PAGE_LEAGUE; } return pageID; } /** * 获取跳转参数 */ public Map<String, Object> getJumpParam(){ return mJumpMap; } }该Parser的原理是:根据传人的字符串参数,按照“&”符号将信息拆解,再根据“=”将信息分为key,value结构。原结构为("page='detail'&sid='88988'")。然后对外提供获取方法。
setExtraJump方法:执行跳转(代码参考)
private void setExtraJump() { KEY_PAGEID pageId = mExtraJumpParser.getExtraPageID(); if (pageId != null) { Map<String, Object> param = mExtraJumpParser.getJumpParam(); if (pageId == KEY_PAGEID.PAGE_PLAY) { PLAY_DATA playData = new PLAY_DATA(); playData.sid = (String) param.get(KEY_PAGEDATA.SID); playData.contentType = (String) param.get(KEY_PAGEDATA.CONTENTTYPE); playData.supplyType = (String) param.get(KEY_PAGEDATA.SUPPLYTYPE); param.put(KEY_PAGEDATA.PLAYDATA, playData); StaticFunction.getPageHelper().jumpPage(KEY_PAGEID.PAGE_PLAY,param); } else { StaticFunction.getPageHelper().jumpPage(pageId, param); } } StaticFunction.getPageHelper().finishPage(null); }页面跳转的帮助类:PageHelper
public class PageHelper { private Map<KEY_PAGEID, Map<String, Object>> mActivityInfo = new HashMap<KEY_PAGEID, Map<String, Object>>(); private ArrayList<Activity> mActivityList = new ArrayList<Activity>(); private ArrayList<KEY_PAGEID> mPageIDList = new ArrayList<KEY_PAGEID>(); /** * 释放资源 */ public void release() { mActivityInfo.clear(); mActivityList.clear(); mPageIDList.clear(); } /** * 添加activity实例 * * @param context * 上下文 */ public void addActivity(Activity context) { if (mActivityList != null) { mActivityList.add(context); } } /** * 跳转页面 * * @param context * 当前页面的上下文 * @param id * 跳转页面ID * @param value * 跳转页面所需参数 */ public void jumpPage(KEY_PAGEID id, Map<String, Object> value) { if (mActivityInfo != null) { mActivityInfo.put(id, value); mPageIDList.add(id); } if (mActivityList != null && mActivityList.size() > 0) { Class<?> className = getJumpClassName(id); Activity context = mActivityList.get(mActivityList.size() - 1); Intent intent = new Intent(context, className); context.startActivity(intent); } } /** * 第三方跳转入口 * * @param context * 上下午 * @param action * 跳转ACTION,统一在Define ACTION_EXTRAAPP中定义 * @param page * 跳转页面,统一在 Define PAGE_EXTRAAPP中定义 */ public void jumpExtraAPP(Context context, String action, String page) { String pageInfoString = page; Intent testIntent = new Intent(); testIntent.setAction(action); testIntent.putExtra("Data", pageInfoString); testIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(testIntent); } /** * 返回至某一页面 * * @param id * 页面ID */ public void backToPage(KEY_PAGEID id) { if (mPageIDList.contains(id)) { int index = mPageIDList.lastIndexOf(id); KEY_PAGEID tmpID = null; Activity context = null; int needFinishCount = (mPageIDList.size() - 1) - index; for (int i = 0; i < needFinishCount; i++) { tmpID = mPageIDList.get(mPageIDList.size() - 1); mActivityInfo.remove(tmpID); context = mActivityList.get(mActivityList.size() - 1); mActivityList.remove(mActivityList.size() - 1); mPageIDList.remove(mPageIDList.size() - 1); context.finish(); } } } /** * 销毁当前页面并返回至上级页面 * * @param id * 页面id */ public void finishPage(KEY_PAGEID id) { if (mActivityInfo != null && id != null) { if (!mActivityInfo.containsKey(id) && mActivityInfo.size() > 0) { return; } mActivityInfo.remove(id); mPageIDList.remove(id); } if (StaticFunction.getHandler().hasMessages(KEY_MSGINFO.KEY_PAGEFINISH)) { StaticFunction.getHandler().removeMessages(KEY_MSGINFO.KEY_PAGEFINISH); } if (mActivityList != null && mActivityList.size() > 0) { Activity context = mActivityList.get(mActivityList.size() - 1); mActivityList.remove(mActivityList.size() - 1); context.finish(); } if (mActivityList.size() == 0 && id != null) { GeneralHelper.release(); } } /** * 延迟销毁页面 * * @param id * 页面id */ public void delayFinishPage(KEY_PAGEID id) { Message msg = Message.obtain(StaticFunction.getHandler(), KEY_MSGINFO.KEY_PAGEFINISH, id); StaticFunction.getHandler().sendMessageDelayed(msg, CommonDefine.ACTIVITY_FINISH_WAITING); } /** * 获取当前页面的跳转参数信息 * * @param id * 页面ID * @return 返回参数信息 */ public Map<String, Object> getPageInfo(KEY_PAGEID id) { if (mActivityInfo.containsKey(id)) { return mActivityInfo.get(id); } return null; } /** * 获取当前激活页面的Activity上下文 * * @return 返回Activity上下文,失败返回null */ public Activity getCurActivity() { if (mActivityList != null && mActivityList.size() > 0) { return mActivityList.get(mActivityList.size() - 1); } return null; } /** * 获取当前的页面id */ public KEY_PAGEID getCurPageID(){ if(mPageIDList!=null&&mPageIDList.size()>0){ return mPageIDList.get(mPageIDList.size()-1); } return KEY_PAGEID.PAGE_NULL; } ///////////////////////////////////////// // TODO private Class<?> getJumpClassName(KEY_PAGEID id) { switch (id) { case PAGE_DETAIL: break; case PAGE_HOME: return LauncherActivity.class; case PAGE_LIVE: return LiveActivity.class; case PAGE_LEAGUE: return LeagueActivity.class; case PAGE_PLAY: return PlayActivity.class; case PAGE_EVENTDETAIL: return EventDetailActivity.class; case PAGE_COLLECTION: return CollectionActivity.class; default: break; } return null; }
注意:一定是在startActivity中做的跳转处理,其他的activity可以从PageHelper中的getPageInfo获取相应的需要信息。
请求发送端逻辑
可以从第三方的APP跳转到另一个APP中的某个特殊页面。方法参考:
public void jumpExtraAPP(String action, String page) { try { String pageInfoString = page; Intent testIntent = new Intent(); testIntent.setAction(action); Log.i("info", pageInfoString); testIntent.putExtra("Data", pageInfoString); testIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(testIntent); } catch (Exception e) { e.printStackTrace(); } }
可能很啰嗦,也可能根本没说明白,但是要理解这也是一种协议,这边怎么发,那边怎么收,要约定好。
相关文章推荐
- Android的进程回收机制
- android中webview加载html,输入框不能输入内容问题记录
- android四大组件
- Android status icon remove
- android 软键盘的使用
- android:scrollbarStyle属性及滚动条和分割线覆盖问题
- Android Native反调试
- [Android]对MVC和MVP的总结
- Android在第三方应用程序系统应用尽早开始,杀死自己主动的第三方应用程序,以重新启动
- android manifest文件
- android:layout_weight的真实含义
- Android之警告对话框alertdialog
- Android studio aidl文件的创建使用
- Android 程序中禁止屏幕旋转和重启Activity
- Android实现全屏显示的方法
- android 应用程序混淆打包说明
- Android 开启指定名称的WiFi热点
- Android内存分析工具DDMS heap + MAT 安装和使用
- android 证书签名命令
- Android中欢迎页面简单设计