package com.dianping.loader; import java.util.List; import android.content.Intent; import android.content.pm.ResolveInfo; import android.os.Bundle; import android.util.Log; import android.view.Gravity; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.TextView; import com.dianping.app.MyActivity; import com.dianping.app.MyApplication; /** * 根据URL Map处理外部链接打开URL Scheme的跳转逻辑 * <p> * 在AndroidManifest.xml中注册应用的host为ForwardActivity<br> * * @author Yimin * */ public class ForwardActivity extends MyActivity { private FrameLayout rootView; private boolean launched; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); rootView = new FrameLayout(this); rootView.setLayoutParams(new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); rootView.setId(android.R.id.primary); setContentView(rootView); launched = savedInstanceState == null ? false : savedInstanceState .getBoolean("launched"); if (!(getApplication() instanceof MyApplication)) { TextView text = new TextView(this); text.setText("无法载入页面 #401"); // #401 text.setLayoutParams(new FrameLayout.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.CENTER)); rootView.addView(text); return; } doForward(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean("launched", launched); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 1) { setResult(resultCode, data); finish(); } super.onActivityResult(requestCode, resultCode, data); } protected void doForward() { if (launched) return; Intent intent = getIntent(); Intent i = new Intent(intent.getAction(), intent.getData()); if (intent.getExtras() != null) { i.putExtras(intent.getExtras()); } intent = urlMap(i); try { // check if it open myself to avoid infinite loop List<ResolveInfo> l = getPackageManager().queryIntentActivities( intent, 0); if (l.size() == 1) { ResolveInfo ri = l.get(0); if (getPackageName().equals(ri.activityInfo.packageName)) { if (getClass().getName().equals(ri.activityInfo.name)) { throw new Exception("infinite loop"); } } } else if (l.size() > 1) { // should not happen, do we allow this? } startActivityForResult(intent, 1); launched = true; } catch (Exception e) { TextView text = new TextView(this); text.setText("无法载入页面 #402"); // #402 text.append("\n" + e.toString()); text.setLayoutParams(new FrameLayout.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.CENTER)); rootView.addView(text); Log.e("loader", "unable to forward " + getIntent(), e); } } }