<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>润物无声 &#187; Adobe</title>
	<atom:link href="http://blog.zhourunsheng.com/tag/adobe/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.zhourunsheng.com</link>
	<description>天空一朵雨做的云</description>
	<lastBuildDate>Sat, 08 May 2021 05:17:21 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.41</generator>
	<item>
		<title>AIR for Android 之源码和实现原理分析</title>
		<link>http://blog.zhourunsheng.com/2011/07/air-for-android-%e4%b9%8b%e6%ba%90%e7%a0%81%e5%92%8c%e5%ae%9e%e7%8e%b0%e5%8e%9f%e7%90%86%e5%88%86%e6%9e%90/</link>
		<comments>http://blog.zhourunsheng.com/2011/07/air-for-android-%e4%b9%8b%e6%ba%90%e7%a0%81%e5%92%8c%e5%ae%9e%e7%8e%b0%e5%8e%9f%e7%90%86%e5%88%86%e6%9e%90/#comments</comments>
		<pubDate>Sat, 02 Jul 2011 07:55:24 +0000</pubDate>
		<dc:creator><![CDATA[润物无声]]></dc:creator>
				<category><![CDATA[移动开发]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://blog.zhourunsheng.com/?p=266</guid>
		<description><![CDATA[<p>airbootstap.jar 的实现机制简单来说其实就是：   通过继承Android的Activity来实 [&#8230;]</p>
<p><a rel="nofollow" href="http://blog.zhourunsheng.com/2011/07/air-for-android-%e4%b9%8b%e6%ba%90%e7%a0%81%e5%92%8c%e5%ae%9e%e7%8e%b0%e5%8e%9f%e7%90%86%e5%88%86%e6%9e%90/">AIR for Android 之源码和实现原理分析</a>，首发于<a rel="nofollow" href="http://blog.zhourunsheng.com">润物无声</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>airbootstap.jar 的实现机制简单来说其实就是： </p>
<p> 通过继承Android的Activity来实现一个新的Activity（AppEntry），它通过“com.adobe.air.AndroidActivityWrapper” 封装实现了Android中Activity本身的方法，例如onResume，onPause等等，废话不说，直接上源码，相信大家浏览过一遍 就基本清楚了。</p>
<pre>package air.app;

import java.lang.reflect.Method;
import java.net.URISyntaxException;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Process;
import android.util.AttributeSet;
import android.view.ContextMenu;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import dalvik.system.DexClassLoader;

public class AppEntry extends Activity {
 private static final String LOG_TAG = "AppEntry";
 private static String RUNTIME_PACKAGE_ID = "com.adobe.air";
 private static Object sAndroidActivityWrapper = null;
 private static Class&lt;?&gt; sAndroidActivityWrapperClass;
 private static boolean sDexLoaded = false;
 private static DexClassLoader sDloader;

 /**
  * Activity 的 启动函数，用来初始化Adobe AIR的环境
  * */
 public void onCreate(Bundle paramBundle) {
  super.onCreate(paramBundle);
  if (!isRuntimeInstalled()) {
   showDialog();
  } else {
   loadDexAndCreateActivityWrapper();
   if (!sDexLoaded) {
    launchAIRService();
   } else {
    InvokeWrapperOnCreate();
   }
  }
 }

 /**
  * 执行指定的方法：paramMethod为方法名，paramArrayOfObject为方法的参数
  *
  * */
 private Object InvokeMethod(Method paramMethod, Object[] paramArrayOfObject) {
  Object localObject1 = null;
  if (!sDexLoaded) {
   return localObject1;
  }

  try {
   if (paramArrayOfObject != null) {
    localObject1 = paramMethod.invoke(sAndroidActivityWrapper,
      paramArrayOfObject);
   } else {
    Object[] arrayOfObject = new Object[0];
    localObject1 = paramMethod.invoke(sAndroidActivityWrapper,
      arrayOfObject);
   }
  } catch (Exception localException) {
  }
  return localObject1;
 }

 /**
  * 主要用来初始化Activity的包装类 sAndroidActivityWrapperClass， 后续的方法调用都是通过它来的
  * */
 private void InvokeWrapperOnCreate() {
  try {
   Class localClass = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[2];
   arrayOfClass[0] = Activity.class;
   arrayOfClass[1] = String[].class;
   Method localMethod = localClass.getMethod("onCreate", arrayOfClass);
   Boolean localBoolean1 = new Boolean(false);
   Boolean localBoolean2 = new Boolean(true);
   String[] arrayOfString = new String[5];
   arrayOfString[0] = "";
   arrayOfString[1] = "";
   arrayOfString[2] = "-nodebug";
   arrayOfString[3] = localBoolean1.toString();
   arrayOfString[4] = localBoolean2.toString();

   Object[] arrayOfObject = new Object[2];
   arrayOfObject[0] = this;
   arrayOfObject[1] = arrayOfString;
   InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
  }
 }

 private static void KillSelf() {
  Process.killProcess(Process.myPid());
 }

 /**
  * 用来启动Adobe AIR service服务
  * */
 private void launchAIRService() {
  try {
   Intent localIntent1 = new Intent("com.adobe.air.AIRServiceAction");
   localIntent1.setClassName(RUNTIME_PACKAGE_ID,
     "com.adobe.air.AIRService");

   bindService(localIntent1, new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName arg0, IBinder arg1) {
     unbindService(this);
     loadDexAndCreateActivityWrapper();
     if (AppEntry.sDexLoaded) {
      InvokeWrapperOnCreate();
     } else {
      AppEntry.KillSelf();
     }
    }

    @Override
    public void onServiceDisconnected(ComponentName arg0) {
    }

   }, 1);
  } catch (Exception localException) {
  }
 }

 /**
  * 启动Android Market 来下载 Adobe AIR for Android 的apk程序
  * */
 private void launchMarketPlaceForAIR() {
  String str2 = null;
  try {
   PackageManager localPackageManager = getPackageManager();
   ComponentName localComponentName = getComponentName();
   Bundle localBundle = localPackageManager.getActivityInfo(
     localComponentName, 128).metaData;
   if (localBundle != null) {
    str2 = (String) localBundle.get("airDownloadURL");
   }
  } catch (android.content.pm.PackageManager.NameNotFoundException namenotfoundexception) {
  }

  if (str2 == null) {
   StringBuilder localStringBuilder = new StringBuilder()
     .append("market://details?id=");
   str2 = localStringBuilder.append(RUNTIME_PACKAGE_ID).toString();
  }
  BroadcastIntent("android.intent.action.VIEW", str2);
 }

 /**
  * 创建 DexClassLoader， sAndroidActivityWrapperClass 和 初始化
  * sAndroidActivityWrapper（通过调用方法CreateAndroidActivityWrapper）
  * */
 private void loadDexAndCreateActivityWrapper() {
  try {
   if (!sDexLoaded) {
    Context localContext = createPackageContext(RUNTIME_PACKAGE_ID,
      3);
    String str2 = RUNTIME_PACKAGE_ID;
    String str3 = getFilesDir().getAbsolutePath();
    ClassLoader localClassLoader = localContext.getClassLoader();
    sDloader = new DexClassLoader(str2, str3, null,
      localClassLoader);
    sAndroidActivityWrapperClass = sDloader
      .loadClass("com.adobe.air.AndroidActivityWrapper");
    if (sAndroidActivityWrapperClass != null) {
     sDexLoaded = true;
    }
   }

   Class localClass = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[1];
   arrayOfClass[0] = Activity.class;
   Method localMethod = localClass.getMethod(
     "CreateAndroidActivityWrapper", arrayOfClass);
   Object[] arrayOfObject = new Object[1];
   arrayOfObject[0] = this;
   sAndroidActivityWrapper = localMethod.invoke(null, arrayOfObject);
  } catch (Exception localException) {
  }
 }

 /**
  * 用来启动 Activity
  * */
 public void BroadcastIntent(String paramString1, String paramString2) {
  try {
   Intent localIntent = Intent.parseUri(paramString2, 0)
     .setAction(paramString1).addFlags(268435456);
   startActivity(localIntent);
  } catch (ActivityNotFoundException localActivityNotFoundException) {
  } catch (URISyntaxException localURISyntaxException) {
  }
 }

 public void finishActivityFromChild(Activity paramActivity, int paramInt) {
  super.finishActivityFromChild(paramActivity, paramInt);
  try {
   Class localClass1 = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[2];
   arrayOfClass[0] = Activity.class;
   arrayOfClass[1] = Integer.TYPE;
   Method localMethod = localClass1.getMethod(
     "finishActivityFromChild", arrayOfClass);
   Object[] arrayOfObject = new Object[2];
   arrayOfObject[0] = paramActivity;
   Integer localInteger = Integer.valueOf(paramInt);
   arrayOfObject[1] = localInteger;
   InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
  }
 }

 public void finishFromChild(Activity paramActivity) {
  super.finishFromChild(paramActivity);
  try {
   Class localClass = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[1];
   arrayOfClass[0] = Activity.class;
   Method localMethod = localClass.getMethod("finishFromChild",
     arrayOfClass);
   Object[] arrayOfObject = new Object[1];
   arrayOfObject[0] = paramActivity;
   InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
  }
 }

 /**
  * 通过 getPackageInfo 的方法来测试 Adobe AIR 环境是否ready，如果抛出异常， 说明Adobe
  * AIR的相关软件还没有安装
  * */
 public boolean isRuntimeInstalled() {
  PackageManager localPackageManager = getPackageManager();
  int i;
  try {
   PackageInfo localPackageInfo = localPackageManager.getPackageInfo(
     RUNTIME_PACKAGE_ID, 256);
   i = 1;
  } catch (PackageManager.NameNotFoundException localNameNotFoundException) {
   i = 0;
  }

  return i == 1;
 }

 protected void onActivityResult(int paramInt1, int paramInt2,
   Intent paramIntent) {
  try {
   if (sDexLoaded) {
    Class localClass1 = sAndroidActivityWrapperClass;
    Class[] arrayOfClass = new Class[3];
    arrayOfClass[0] = Integer.TYPE;
    arrayOfClass[1] = Integer.TYPE;
    arrayOfClass[2] = Intent.class;
    Method localMethod = localClass1.getMethod("onActivityResult",
      arrayOfClass);
    Object[] arrayOfObject = new Object[3];
    Integer localInteger1 = Integer.valueOf(paramInt1);
    arrayOfObject[0] = localInteger1;
    Integer localInteger2 = Integer.valueOf(paramInt2);
    arrayOfObject[1] = localInteger2;
    arrayOfObject[2] = paramIntent;
    InvokeMethod(localMethod, arrayOfObject);
   }
  } catch (Exception localException) {
  }
 }

 protected void onApplyThemeResource(Resources.Theme paramTheme,
   int paramInt, boolean paramBoolean) {
  super.onApplyThemeResource(paramTheme, paramInt, paramBoolean);
  try {
   Class localClass1 = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[3];
   arrayOfClass[0] = Resources.Theme.class;
   arrayOfClass[1] = Integer.TYPE;
   arrayOfClass[2] = Boolean.TYPE;
   Method localMethod = localClass1.getMethod("onApplyThemeResource",
     arrayOfClass);
   Object[] arrayOfObject = new Object[3];
   arrayOfObject[0] = paramTheme;
   Integer localInteger = Integer.valueOf(paramInt);
   arrayOfObject[1] = localInteger;
   Boolean localBoolean = Boolean.valueOf(paramBoolean);
   arrayOfObject[2] = localBoolean;
   InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
  }
 }

 public void onAttachedToWindow() {
  super.onAttachedToWindow();
  try {
   Class localClass = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[0];
   Method localMethod = localClass.getMethod("onAttachedToWindow",
     arrayOfClass);
   Object[] arrayOfObject = new Object[0];
   InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
  }
 }

 public void onBackPressed() {
  super.onBackPressed();
  try {
   Class localClass = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[0];
   Method localMethod = localClass.getMethod("onBackPressed",
     arrayOfClass);
   Object[] arrayOfObject = new Object[0];
   InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
  }
 }

 protected void onChildTitleChanged(Activity paramActivity,
   CharSequence paramCharSequence) {
  super.onChildTitleChanged(paramActivity, paramCharSequence);
  try {
   Class localClass = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[2];
   arrayOfClass[0] = Activity.class;
   arrayOfClass[1] = CharSequence.class;
   Method localMethod = localClass.getMethod("onChildTitleChanged",
     arrayOfClass);
   Object[] arrayOfObject = new Object[2];
   arrayOfObject[0] = paramActivity;
   arrayOfObject[1] = paramCharSequence;
   InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
  }
 }

 public void onConfigurationChanged(Configuration paramConfiguration) {
  super.onConfigurationChanged(paramConfiguration);
  try {
   Class localClass = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[1];
   arrayOfClass[0] = Configuration.class;
   Method localMethod = localClass.getMethod("onConfigurationChanged",
     arrayOfClass);
   Object[] arrayOfObject = new Object[1];
   arrayOfObject[0] = paramConfiguration;
   InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
  }
 }

 public void onContentChanged() {
  super.onContentChanged();
  try {
   Class localClass = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[0];
   Method localMethod = localClass.getMethod("onContentChanged",
     arrayOfClass);
   Object[] arrayOfObject = new Object[0];
   InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
  }
 }

 public boolean onContextItemSelected(MenuItem paramMenuItem) {
  boolean bool1 = super.onContextItemSelected(paramMenuItem);
  boolean bool3;
  try {
   Class localClass1 = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[2];
   arrayOfClass[0] = MenuItem.class;
   arrayOfClass[1] = Boolean.TYPE;
   Method localMethod = localClass1.getMethod("onContextItemSelected",
     arrayOfClass);
   Object[] arrayOfObject = new Object[2];
   arrayOfObject[0] = paramMenuItem;
   Boolean localBoolean = Boolean.valueOf(bool1);
   arrayOfObject[1] = localBoolean;
   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))
     .booleanValue();
  } catch (Exception localException) {
   bool3 = bool1;
  }
  return bool3;
 }

 public void onContextMenuClosed(Menu paramMenu) {
  super.onContextMenuClosed(paramMenu);
  try {
   Class localClass = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[1];
   arrayOfClass[0] = Menu.class;
   Method localMethod = localClass.getMethod("onContextMenuClosed",
     arrayOfClass);
   Object[] arrayOfObject = new Object[1];
   arrayOfObject[0] = paramMenu;
   InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
  }
 }

 public void onCreateContextMenu(ContextMenu paramContextMenu,
   View paramView, ContextMenu.ContextMenuInfo paramContextMenuInfo) {
  super.onCreateContextMenu(paramContextMenu, paramView,
    paramContextMenuInfo);
  try {
   Class localClass = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[3];
   arrayOfClass[0] = ContextMenu.class;
   arrayOfClass[1] = View.class;
   arrayOfClass[2] = ContextMenu.ContextMenuInfo.class;
   Method localMethod = localClass.getMethod("onCreateContextMenu",
     arrayOfClass);
   Object[] arrayOfObject = new Object[3];
   arrayOfObject[0] = paramContextMenu;
   arrayOfObject[1] = paramView;
   arrayOfObject[2] = paramContextMenuInfo;
   InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
  }
 }

 public CharSequence onCreateDescription() {
  CharSequence localCharSequence = super.onCreateDescription();
  Object localObject;
  try {
   Class localClass = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[1];
   arrayOfClass[0] = CharSequence.class;
   Method localMethod = localClass.getMethod("onCreateDescription",
     arrayOfClass);
   Object[] arrayOfObject = new Object[1];
   arrayOfObject[0] = localCharSequence;
   localObject = (CharSequence) InvokeMethod(localMethod,
     arrayOfObject);
  } catch (Exception localException) {
   localObject = localCharSequence;
  }
  return (CharSequence) localObject;
 }

 protected Dialog onCreateDialog(int paramInt) {
  Dialog localDialog = super.onCreateDialog(paramInt);
  Object localObject;
  try {
   Class localClass1 = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[2];
   arrayOfClass[0] = Integer.TYPE;
   arrayOfClass[1] = Dialog.class;
   Method localMethod = localClass1.getMethod("onCreateDialog",
     arrayOfClass);
   Object[] arrayOfObject = new Object[2];
   Integer localInteger = Integer.valueOf(paramInt);
   arrayOfObject[0] = localInteger;
   arrayOfObject[1] = localDialog;
   localObject = (Dialog) InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
   localObject = localDialog;
  }
  return (Dialog) localObject;
 }

 protected Dialog onCreateDialog(int paramInt, Bundle paramBundle) {
  Dialog localDialog = super.onCreateDialog(paramInt, paramBundle);
  Object localObject;
  try {
   Class localClass1 = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[3];
   arrayOfClass[0] = Integer.TYPE;
   arrayOfClass[1] = Bundle.class;
   arrayOfClass[2] = Dialog.class;
   Method localMethod = localClass1.getMethod("onCreateDialog",
     arrayOfClass);
   Object[] arrayOfObject = new Object[3];
   Integer localInteger = Integer.valueOf(paramInt);
   arrayOfObject[0] = localInteger;
   arrayOfObject[1] = paramBundle;
   arrayOfObject[2] = localDialog;
   localObject = (Dialog) InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
   localObject = localDialog;
  }

  return (Dialog) localObject;
 }

 public boolean onCreateOptionsMenu(Menu paramMenu) {
  boolean bool1 = super.onCreateOptionsMenu(paramMenu);
  boolean bool3;
  try {
   Class localClass1 = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[2];
   arrayOfClass[0] = Menu.class;
   arrayOfClass[1] = Boolean.TYPE;
   Method localMethod = localClass1.getMethod("onCreateOptionsMenu",
     arrayOfClass);
   Object[] arrayOfObject = new Object[2];
   arrayOfObject[0] = paramMenu;
   Boolean localBoolean = Boolean.valueOf(bool1);
   arrayOfObject[1] = localBoolean;
   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))
     .booleanValue();
  } catch (Exception localException) {
   bool3 = bool1;
  }
  return bool3;
 }

 public boolean onCreatePanelMenu(int paramInt, Menu paramMenu) {
  boolean bool1 = super.onCreatePanelMenu(paramInt, paramMenu);
  boolean bool3;
  try {
   Class localClass1 = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[3];
   arrayOfClass[0] = Integer.TYPE;
   arrayOfClass[1] = Menu.class;
   arrayOfClass[2] = Boolean.TYPE;
   Method localMethod = localClass1.getMethod("onCreatePanelMenu",
     arrayOfClass);
   Object[] arrayOfObject = new Object[3];
   Integer localInteger = Integer.valueOf(paramInt);
   arrayOfObject[0] = localInteger;
   arrayOfObject[1] = paramMenu;
   Boolean localBoolean = Boolean.valueOf(bool1);
   arrayOfObject[2] = localBoolean;
   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))
     .booleanValue();
  } catch (Exception localException) {
   bool3 = bool1;
  }
  return bool3;
 }

 public View onCreatePanelView(int paramInt) {
  View localView = super.onCreatePanelView(paramInt);
  Object localObject;
  try {
   Class localClass1 = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[2];
   arrayOfClass[0] = Integer.TYPE;
   arrayOfClass[1] = View.class;
   Method localMethod = localClass1.getMethod("onCreatePanelView",
     arrayOfClass);
   Object[] arrayOfObject = new Object[2];
   Integer localInteger = Integer.valueOf(paramInt);
   arrayOfObject[0] = localInteger;
   arrayOfObject[1] = localView;
   localObject = (View) InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
   localObject = localView;
  }
  return (View) localObject;
 }

 public boolean onCreateThumbnail(Bitmap paramBitmap, Canvas paramCanvas) {
  boolean bool1 = super.onCreateThumbnail(paramBitmap, paramCanvas);
  boolean bool3;
  try {
   Class localClass1 = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[3];
   arrayOfClass[0] = Bitmap.class;
   arrayOfClass[1] = Canvas.class;
   arrayOfClass[2] = Boolean.TYPE;
   Method localMethod = localClass1.getMethod("onCreateThumbnail",
     arrayOfClass);
   Object[] arrayOfObject = new Object[3];
   arrayOfObject[0] = paramBitmap;
   arrayOfObject[1] = paramCanvas;
   Boolean localBoolean = Boolean.valueOf(bool1);
   arrayOfObject[2] = localBoolean;
   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))
     .booleanValue();
  } catch (Exception localException) {
   bool3 = bool1;
  }
  return bool3;
 }

 public View onCreateView(String paramString, Context paramContext,
   AttributeSet paramAttributeSet) {
  View localView = super.onCreateView(paramString, paramContext,
    paramAttributeSet);
  Object localObject;
  try {
   Class localClass = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[4];
   arrayOfClass[0] = String.class;
   arrayOfClass[1] = Context.class;
   arrayOfClass[2] = AttributeSet.class;
   arrayOfClass[3] = View.class;
   Method localMethod = localClass.getMethod("onCreateView",
     arrayOfClass);
   Object[] arrayOfObject = new Object[4];
   arrayOfObject[0] = paramString;
   arrayOfObject[1] = paramContext;
   arrayOfObject[2] = paramAttributeSet;
   arrayOfObject[3] = localView;
   localObject = (View) InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
   localObject = localView;
  }
  return (View) localObject;
 }

 public void onDestroy() {
  super.onDestroy();
  try {
   Class localClass = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[0];
   Method localMethod = localClass
     .getMethod("onDestroy", arrayOfClass);
   Object[] arrayOfObject = new Object[0];
   InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
  }
 }

 public void onDetachedFromWindow() {
  super.onDetachedFromWindow();
  try {
   Class localClass = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[0];
   Method localMethod = localClass.getMethod("onDetachedFromWindow",
     arrayOfClass);
   Object[] arrayOfObject = new Object[0];
   InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
  }
 }

 public boolean onKeyDown(int paramInt, KeyEvent paramKeyEvent) {
  boolean bool1 = super.onKeyDown(paramInt, paramKeyEvent);
  boolean bool3;
  try {
   Class localClass1 = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[3];
   arrayOfClass[0] = Integer.TYPE;
   arrayOfClass[1] = KeyEvent.class;
   arrayOfClass[2] = Boolean.TYPE;
   Method localMethod = localClass1.getMethod("onKeyDown",
     arrayOfClass);
   Object[] arrayOfObject = new Object[3];
   Integer localInteger = Integer.valueOf(paramInt);
   arrayOfObject[0] = localInteger;
   arrayOfObject[1] = paramKeyEvent;
   Boolean localBoolean = Boolean.valueOf(bool1);
   arrayOfObject[2] = localBoolean;
   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))
     .booleanValue();
  } catch (Exception localException) {
   bool3 = bool1;
  }
  return bool3;
 }

 public boolean onKeyLongPress(int paramInt, KeyEvent paramKeyEvent) {
  boolean bool1 = super.onKeyLongPress(paramInt, paramKeyEvent);
  boolean bool3;
  try {
   Class localClass1 = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[3];
   arrayOfClass[0] = Integer.TYPE;
   arrayOfClass[1] = KeyEvent.class;
   arrayOfClass[2] = Boolean.TYPE;
   Method localMethod = localClass1.getMethod("onKeyLongPress",
     arrayOfClass);
   Object[] arrayOfObject = new Object[3];
   Integer localInteger = Integer.valueOf(paramInt);
   arrayOfObject[0] = localInteger;
   arrayOfObject[1] = paramKeyEvent;
   Boolean localBoolean = Boolean.valueOf(bool1);
   arrayOfObject[2] = localBoolean;
   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))
     .booleanValue();
  } catch (Exception localException) {
   bool3 = bool1;
  }
  return bool3;
 }

 public boolean onKeyMultiple(int paramInt1, int paramInt2,
   KeyEvent paramKeyEvent) {
  boolean bool1 = super
    .onKeyMultiple(paramInt1, paramInt2, paramKeyEvent);
  boolean bool3;
  try {
   Class localClass1 = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[4];
   arrayOfClass[0] = Integer.TYPE;
   arrayOfClass[1] = Integer.TYPE;
   arrayOfClass[2] = KeyEvent.class;
   arrayOfClass[3] = Boolean.TYPE;
   Method localMethod = localClass1.getMethod("onKeyMultiple",
     arrayOfClass);
   Object[] arrayOfObject = new Object[4];
   Integer localInteger1 = Integer.valueOf(paramInt1);
   arrayOfObject[0] = localInteger1;
   Integer localInteger2 = Integer.valueOf(paramInt2);
   arrayOfObject[1] = localInteger2;
   arrayOfObject[2] = paramKeyEvent;
   Boolean localBoolean = Boolean.valueOf(bool1);
   arrayOfObject[3] = localBoolean;
   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))
     .booleanValue();
  } catch (Exception localException) {
   bool3 = bool1;
  }
  return bool3;
 }

 public boolean onKeyUp(int paramInt, KeyEvent paramKeyEvent) {
  boolean bool1 = super.onKeyUp(paramInt, paramKeyEvent);
  boolean bool3;
  try {
   Class localClass1 = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[3];
   arrayOfClass[0] = Integer.TYPE;
   arrayOfClass[1] = KeyEvent.class;
   arrayOfClass[2] = Boolean.TYPE;
   Method localMethod = localClass1.getMethod("onKeyUp", arrayOfClass);
   Object[] arrayOfObject = new Object[3];
   Integer localInteger = Integer.valueOf(paramInt);
   arrayOfObject[0] = localInteger;
   arrayOfObject[1] = paramKeyEvent;
   Boolean localBoolean = Boolean.valueOf(bool1);
   arrayOfObject[2] = localBoolean;
   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))
     .booleanValue();
  } catch (Exception localException) {
   bool3 = bool1;
  }
  return bool3;
 }

 public void onLowMemory() {
  try {
   Class localClass = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[0];
   Method localMethod = localClass.getMethod("onLowMemory",
     arrayOfClass);
   Object[] arrayOfObject = new Object[0];
   InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
  }
 }

 public boolean onMenuItemSelected(int paramInt, MenuItem paramMenuItem) {
  boolean bool1 = super.onMenuItemSelected(paramInt, paramMenuItem);
  boolean bool3;
  try {
   Class localClass1 = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[3];
   arrayOfClass[0] = Integer.TYPE;
   arrayOfClass[1] = MenuItem.class;
   arrayOfClass[2] = Boolean.TYPE;
   Method localMethod = localClass1.getMethod("onMenuItemSelected",
     arrayOfClass);
   Object[] arrayOfObject = new Object[3];
   Integer localInteger = Integer.valueOf(paramInt);
   arrayOfObject[0] = localInteger;
   arrayOfObject[1] = paramMenuItem;
   Boolean localBoolean = Boolean.valueOf(bool1);
   arrayOfObject[2] = localBoolean;
   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))
     .booleanValue();
  } catch (Exception localException) {
   bool3 = bool1;
  }
  return bool3;
 }

 public boolean onMenuOpened(int paramInt, Menu paramMenu) {
  boolean bool1 = super.onMenuOpened(paramInt, paramMenu);
  boolean bool3;
  try {
   Class localClass1 = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[3];
   arrayOfClass[0] = Integer.TYPE;
   arrayOfClass[1] = Menu.class;
   arrayOfClass[2] = Boolean.TYPE;
   Method localMethod = localClass1.getMethod("onMenuOpened",
     arrayOfClass);
   Object[] arrayOfObject = new Object[3];
   Integer localInteger = Integer.valueOf(paramInt);
   arrayOfObject[0] = localInteger;
   arrayOfObject[1] = paramMenu;
   Boolean localBoolean = Boolean.valueOf(bool1);
   arrayOfObject[2] = localBoolean;
   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))
     .booleanValue();
  } catch (Exception localException) {
   bool3 = bool1;
  }
  return bool3;
 }

 protected void onNewIntent(Intent paramIntent) {
  Intent localIntent = paramIntent;
  super.onNewIntent(localIntent);
  try {
   Class localClass = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[1];
   arrayOfClass[0] = Intent.class;
   Method localMethod = localClass.getMethod("onNewIntent",
     arrayOfClass);
   Object[] arrayOfObject = new Object[1];
   arrayOfObject[0] = localIntent;
   InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
  }
 }

 public boolean onOptionsItemSelected(MenuItem paramMenuItem) {
  boolean bool1 = super.onOptionsItemSelected(paramMenuItem);
  boolean bool3;
  try {
   Class localClass1 = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[2];
   arrayOfClass[0] = MenuItem.class;
   arrayOfClass[1] = Boolean.TYPE;
   Method localMethod = localClass1.getMethod("onOptionsItemSelected",
     arrayOfClass);
   Object[] arrayOfObject = new Object[2];
   arrayOfObject[0] = paramMenuItem;
   Boolean localBoolean = Boolean.valueOf(bool1);
   arrayOfObject[1] = localBoolean;
   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))
     .booleanValue();
  } catch (Exception localException) {
   bool3 = bool1;
  }
  return bool3;
 }

 public void onOptionsMenuClosed(Menu paramMenu) {
  super.onOptionsMenuClosed(paramMenu);
  try {
   Class localClass = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[1];
   arrayOfClass[0] = Menu.class;
   Method localMethod = localClass.getMethod("onOptionsMenuClosed",
     arrayOfClass);
   Object[] arrayOfObject = new Object[1];
   arrayOfObject[0] = paramMenu;
   InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
  }
 }

 public void onPanelClosed(int paramInt, Menu paramMenu) {
  super.onPanelClosed(paramInt, paramMenu);
  try {
   Class localClass1 = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[2];
   arrayOfClass[0] = Integer.TYPE;
   arrayOfClass[1] = Menu.class;
   Method localMethod = localClass1.getMethod("onPanelClosed",
     arrayOfClass);
   Object[] arrayOfObject = new Object[2];
   Integer localInteger = Integer.valueOf(paramInt);
   arrayOfObject[0] = localInteger;
   arrayOfObject[1] = paramMenu;
   InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
  }
 }

 public void onPause() {
  super.onPause();
  try {
   if (sDexLoaded) {
    Class localClass = sAndroidActivityWrapperClass;
    Class[] arrayOfClass = new Class[0];
    Method localMethod = localClass.getMethod("onPause",
      arrayOfClass);
    Object[] arrayOfObject = new Object[0];
    InvokeMethod(localMethod, arrayOfObject);
   }
  } catch (Exception localException) {
  }
 }

 protected void onPostCreate(Bundle paramBundle) {
  super.onPostCreate(paramBundle);
  try {
   Class localClass = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[1];
   arrayOfClass[0] = Bundle.class;
   Method localMethod = localClass.getMethod("onPostCreate",
     arrayOfClass);
   Object[] arrayOfObject = new Object[1];
   arrayOfObject[0] = paramBundle;
   InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
  }
 }

 protected void onPostResume() {
  super.onPostResume();
  try {
   Class localClass = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[0];
   Method localMethod = localClass.getMethod("onPostResume",
     arrayOfClass);
   Object[] arrayOfObject = new Object[0];
   InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
  }
 }

 protected void onPrepareDialog(int paramInt, Dialog paramDialog) {
  super.onPrepareDialog(paramInt, paramDialog);
  try {
   Class localClass = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[2];
   // arrayOfClass[0] = R.id.class;
   // 因为此处的第一个参数为int类型，所以做个替换就OK
   arrayOfClass[0] = Integer.TYPE;
   arrayOfClass[1] = Dialog.class;
   Method localMethod = localClass.getMethod("onPrepareDialog",
     arrayOfClass);
   Object[] arrayOfObject = new Object[2];
   Integer localInteger = Integer.valueOf(paramInt);
   arrayOfObject[0] = localInteger;
   arrayOfObject[1] = paramDialog;
   InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
  }
 }

 protected void onPrepareDialog(int paramInt, Dialog paramDialog,
   Bundle paramBundle) {
  super.onPrepareDialog(paramInt, paramDialog, paramBundle);
  try {
   Class localClass = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[3];
   // arrayOfClass[0] = R.id.class;
   // 因为此处的第一个参数为int类型，所以做个替换就OK
   arrayOfClass[0] = Integer.TYPE;
   arrayOfClass[1] = Dialog.class;
   arrayOfClass[2] = Bundle.class;
   Method localMethod = localClass.getMethod("onPrepareDialog",
     arrayOfClass);
   Object[] arrayOfObject = new Object[3];
   Integer localInteger = Integer.valueOf(paramInt);
   arrayOfObject[0] = localInteger;
   arrayOfObject[1] = paramDialog;
   arrayOfObject[2] = paramBundle;
   InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
  }
 }

 public boolean onPrepareOptionsMenu(Menu paramMenu) {
  boolean bool1 = super.onPrepareOptionsMenu(paramMenu);
  boolean bool3;
  try {
   Class localClass1 = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[2];
   arrayOfClass[0] = Menu.class;
   arrayOfClass[1] = Boolean.TYPE;
   Method localMethod = localClass1.getMethod("onPrepareOptionsMenu",
     arrayOfClass);
   Object[] arrayOfObject = new Object[2];
   arrayOfObject[0] = paramMenu;
   Boolean localBoolean = Boolean.valueOf(bool1);
   arrayOfObject[1] = localBoolean;
   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))
     .booleanValue();
  } catch (Exception localException) {
   bool3 = bool1;
  }
  return bool3;
 }

 public boolean onPreparePanel(int paramInt, View paramView, Menu paramMenu) {
  boolean bool1 = super.onPreparePanel(paramInt, paramView, paramMenu);
  boolean bool3;
  try {
   Class localClass1 = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[4];
   arrayOfClass[0] = Integer.TYPE;
   arrayOfClass[1] = View.class;
   arrayOfClass[2] = Menu.class;
   arrayOfClass[3] = Boolean.TYPE;
   Method localMethod = localClass1.getMethod("onPreparePanel",
     arrayOfClass);
   Object[] arrayOfObject = new Object[4];
   Integer localInteger = Integer.valueOf(paramInt);
   arrayOfObject[0] = localInteger;
   arrayOfObject[1] = paramView;
   arrayOfObject[2] = paramMenu;
   Boolean localBoolean = Boolean.valueOf(bool1);
   arrayOfObject[3] = localBoolean;
   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))
     .booleanValue();
  } catch (Exception localException) {
   bool3 = bool1;
  }
  return bool3;
 }

 public void onRestart() {
  super.onRestart();
  try {
   if (sDexLoaded) {
    Class localClass = sAndroidActivityWrapperClass;
    Class[] arrayOfClass = new Class[0];
    Method localMethod = localClass.getMethod("onRestart",
      arrayOfClass);
    Object[] arrayOfObject = new Object[0];
    InvokeMethod(localMethod, arrayOfObject);
   }
  } catch (Exception localException) {
  }
 }

 protected void onRestoreInstanceState(Bundle paramBundle) {
  super.onRestoreInstanceState(paramBundle);
  try {
   Class localClass = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[1];
   arrayOfClass[0] = Bundle.class;
   Method localMethod = localClass.getMethod("onRestoreInstanceState",
     arrayOfClass);
   Object[] arrayOfObject = new Object[1];
   arrayOfObject[0] = paramBundle;
   InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
  }
 }

 public void onResume() {
  super.onResume();
  try {
   if (sDexLoaded) {
    Class localClass = sAndroidActivityWrapperClass;
    Class[] arrayOfClass = new Class[0];
    Method localMethod = localClass.getMethod("onResume",
      arrayOfClass);
    Object[] arrayOfObject = new Object[0];
    InvokeMethod(localMethod, arrayOfObject);
   }
  } catch (Exception localException) {
  }
 }

 public Object onRetainNonConfigurationInstance() {
  Object localObject1 = super.onRetainNonConfigurationInstance();
  Object localObject3;
  try {
   Class localClass = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[1];
   arrayOfClass[0] = Object.class;
   Method localMethod = localClass.getMethod(
     "onRetainNonConfigurationInstance", arrayOfClass);
   Object[] arrayOfObject = new Object[1];
   arrayOfObject[0] = localObject1;
   localObject3 = InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
   localObject3 = localObject1;
  }
  return localObject3;
 }

 protected void onSaveInstanceState(Bundle paramBundle) {
  super.onSaveInstanceState(paramBundle);
  try {
   Class localClass = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[1];
   arrayOfClass[0] = Bundle.class;
   Method localMethod = localClass.getMethod("onSaveInstanceState",
     arrayOfClass);
   Object[] arrayOfObject = new Object[1];
   arrayOfObject[0] = paramBundle;
   InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
  }
 }

 public boolean onSearchRequested() {
  boolean bool1 = super.onSearchRequested();
  boolean bool3;
  try {
   Class localClass1 = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[1];
   arrayOfClass[0] = Boolean.TYPE;
   Method localMethod = localClass1.getMethod("onSearchRequested",
     arrayOfClass);
   Object[] arrayOfObject = new Object[1];
   Boolean localBoolean = Boolean.valueOf(bool1);
   arrayOfObject[0] = localBoolean;
   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))
     .booleanValue();
  } catch (Exception localException) {
   bool3 = bool1;
  }
  return bool3;
 }

 public void onStart() {
  super.onStart();
 }

 public void onStop() {
  super.onStop();
  try {
   Class localClass = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[0];
   Method localMethod = localClass.getMethod("onStop", arrayOfClass);
   Object[] arrayOfObject = new Object[0];
   InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
  }
 }

 protected void onTitleChanged(CharSequence paramCharSequence, int paramInt) {
  super.onTitleChanged(paramCharSequence, paramInt);
  try {
   Class localClass1 = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[2];
   arrayOfClass[0] = CharSequence.class;
   Class localClass2 = Integer.TYPE;
   arrayOfClass[1] = localClass2;
   Method localMethod = localClass1.getMethod("onTitleChanged",
     arrayOfClass);
   Object[] arrayOfObject = new Object[2];
   arrayOfObject[0] = paramCharSequence;
   Integer localInteger = Integer.valueOf(paramInt);
   arrayOfObject[1] = localInteger;
   InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
  }
 }

 public boolean onTouchEvent(MotionEvent paramMotionEvent) {
  boolean bool1 = super.onTouchEvent(paramMotionEvent);
  boolean bool3;
  try {
   Class localClass1 = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[2];
   arrayOfClass[0] = MotionEvent.class;
   arrayOfClass[1] = Boolean.TYPE;
   Method localMethod = localClass1.getMethod("onTouchEvent",
     arrayOfClass);
   Object[] arrayOfObject = new Object[2];
   arrayOfObject[0] = paramMotionEvent;
   Boolean localBoolean = Boolean.valueOf(bool1);
   arrayOfObject[1] = localBoolean;
   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))
     .booleanValue();
  } catch (Exception localException) {
   bool3 = bool1;
  }
  return bool3;
 }

 public boolean onTrackballEvent(MotionEvent paramMotionEvent) {
  boolean bool1 = super.onTrackballEvent(paramMotionEvent);
  boolean bool3;
  try {
   Class localClass1 = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[2];
   arrayOfClass[0] = MotionEvent.class;
   arrayOfClass[1] = Boolean.TYPE;
   Method localMethod = localClass1.getMethod("onTrackballEvent",
     arrayOfClass);
   Object[] arrayOfObject = new Object[2];
   arrayOfObject[0] = paramMotionEvent;
   Boolean localBoolean = Boolean.valueOf(bool1);
   arrayOfObject[1] = localBoolean;
   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))
     .booleanValue();
  } catch (Exception localException) {
   bool3 = bool1;
  }
  return bool3;
 }

 public void onUserInteraction() {
  super.onUserInteraction();
  try {
   Class localClass = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[0];
   Method localMethod = localClass.getMethod("onUserInteraction",
     arrayOfClass);
   Object[] arrayOfObject = new Object[0];
   InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
  }
 }

 protected void onUserLeaveHint() {
  super.onUserLeaveHint();
  try {
   Class localClass = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[0];
   Method localMethod = localClass.getMethod("onUserLeaveHint",
     arrayOfClass);
   Object[] arrayOfObject = new Object[0];
   InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
  }
 }

 public void onWindowAttributesChanged(
   WindowManager.LayoutParams paramLayoutParams) {
  super.onWindowAttributesChanged(paramLayoutParams);
  try {
   Class localClass = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[1];
   arrayOfClass[0] = WindowManager.LayoutParams.class;
   Method localMethod = localClass.getMethod(
     "onWindowAttributesChanged", arrayOfClass);
   Object[] arrayOfObject = new Object[1];
   arrayOfObject[0] = paramLayoutParams;
   InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
  }
 }

 public void onWindowFocusChanged(boolean paramBoolean) {
  super.onWindowFocusChanged(paramBoolean);
  try {
   Class localClass1 = sAndroidActivityWrapperClass;
   Class[] arrayOfClass = new Class[1];
   arrayOfClass[0] = Boolean.TYPE;
   Method localMethod = localClass1.getMethod("onWindowFocusChanged",
     arrayOfClass);
   Object[] arrayOfObject = new Object[1];
   Boolean localBoolean = Boolean.valueOf(paramBoolean);
   arrayOfObject[0] = localBoolean;
   InvokeMethod(localMethod, arrayOfObject);
  } catch (Exception localException) {
  }
 }

 public void showDialog() {
  AlertDialog.Builder localBuilder1 = new AlertDialog.Builder(this);
  AlertDialog.Builder localBuilder2 = localBuilder1.setTitle(2130968578);
  AlertDialog.Builder localBuilder3 = localBuilder1
    .setMessage(2130968579);

  AlertDialog.Builder localBuilder4 = localBuilder1.setPositiveButton(
    2130968576,
    new android.content.DialogInterface.OnClickListener() {
     @Override
     public void onClick(DialogInterface arg0, int arg1) {
      launchMarketPlaceForAIR();
      System.exit(0);
     }
    });

  AlertDialog.Builder localBuilder5 = localBuilder1.setNegativeButton(
    2130968577,
    new android.content.DialogInterface.OnClickListener() {
     @Override
     public void onClick(DialogInterface arg0, int arg1) {
      System.exit(0);
     }

    });

  AlertDialog.Builder localBuilder6 = localBuilder1
    .setOnCancelListener(new android.content.DialogInterface.OnCancelListener() {
     @Override
     public void onCancel(DialogInterface arg0) {
      System.exit(0);
     }
    });

  AlertDialog localAlertDialog = localBuilder1.show();
 }
}</pre>
<p> 源码看完了，不知大家了解的怎么样了，不管怎样先休息一下，过端午了，先吃粽子啦。。。</p>
<p> 在此祝大家端午节快乐！！！</p>
<p><a rel="nofollow" href="http://blog.zhourunsheng.com/2011/07/air-for-android-%e4%b9%8b%e6%ba%90%e7%a0%81%e5%92%8c%e5%ae%9e%e7%8e%b0%e5%8e%9f%e7%90%86%e5%88%86%e6%9e%90/">AIR for Android 之源码和实现原理分析</a>，首发于<a rel="nofollow" href="http://blog.zhourunsheng.com">润物无声</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zhourunsheng.com/2011/07/air-for-android-%e4%b9%8b%e6%ba%90%e7%a0%81%e5%92%8c%e5%ae%9e%e7%8e%b0%e5%8e%9f%e7%90%86%e5%88%86%e6%9e%90/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>AIR for Android</title>
		<link>http://blog.zhourunsheng.com/2011/07/air-for-android/</link>
		<comments>http://blog.zhourunsheng.com/2011/07/air-for-android/#comments</comments>
		<pubDate>Sat, 02 Jul 2011 07:49:51 +0000</pubDate>
		<dc:creator><![CDATA[润物无声]]></dc:creator>
				<category><![CDATA[移动开发]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://blog.zhourunsheng.com/?p=258</guid>
		<description><![CDATA[<p>工程项目，建立步骤如下： 1. 下载工程项目所需的资源文件 air_for_android-flex_4_5- [&#8230;]</p>
<p><a rel="nofollow" href="http://blog.zhourunsheng.com/2011/07/air-for-android/">AIR for Android</a>，首发于<a rel="nofollow" href="http://blog.zhourunsheng.com">润物无声</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>工程项目，建立步骤如下：</p>
<p><strong>1. </strong>下载工程项目所需的资源文件 <a href="http://carey-blog-image.googlecode.com/files/air_for_android-flex_4_5-air_2_6-v_1.zip" target="_blank">air_for_android-flex_4_5-air_2_6-v_1</a></p>
<p><strong>2.</strong> 建立 Android 工程 TestAIR (注意不要勾选Create Activity，先不创建Activity)</p>
<pre>Porject Name: TestAIR
Standard Android Platform: 2.2
Application Name: TestAIR
Package Name: com.carey
Min SDK Version: 8</pre>
<p><a href="http://blog.zhourunsheng.com/wp-content/uploads/2011/07/TestAIR-project.jpg"><img class="alignnone size-full wp-image-259" title="TestAIR-project" src="http://blog.zhourunsheng.com/wp-content/uploads/2011/07/TestAIR-project.jpg" alt="" width="361" height="500" /></a></p>
<p><strong>3. </strong>将下载下来的资源文件覆盖新创建工程的同名目录和文件，包括 assets 和 res，airbootstap.jar 将作为链接库</p>
<p><strong>4.</strong> 删除"res/layout" 目录</p>
<p><strong>5. </strong>将 airbootstrap.jar 添加到 Build Path</p>
<p><strong>6. </strong>新建一个Class文件，名称为 MainApp，内容如下：</p>
<pre>package com.carey;  
import air.app.AppEntry;
import android.os.Bundle;  

public class MainApp extends AppEntry {    

  @Override   
  public void onCreate(Bundle arg0) {        
      System.out.println("carey test adobe air for android!!!");        
      super.onCreate(arg0);    
  }
}</pre>
<p>7. 更新 Manifest 文件中的 Activity 为 MainApp</p>
<p>内容如下：</p>
<pre>&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.carey" android:versionCode="1" android:versionName="1.0"&gt;
     &lt;uses-sdk android:minSdkVersion="8" /&gt;
     &lt;application android:icon="@drawable/icon" android:label="TestAIR"&gt;
          &lt;activity android:theme="@style/Theme.NoShadow" android:label="app" android:name=".MainApp"
                        android:launchMode="singleTask" android:screenOrientation="nosensor"
                        android:configChanges="keyboardHidden|orientation" android:windowSoftInputMode="stateHidden|adjustResize"&gt;
            &lt;intent-filter&gt;
                   &lt;action android:name="android.intent.action.MAIN" /&gt;
                   &lt;category android:name="android.intent.category.LAUNCHER" /&gt;
            &lt;/intent-filter&gt;
         &lt;/activity&gt;
  &lt;/application&gt;
&lt;/manifest&gt;</pre>
<p>8. 运行程序，可以看到log的输出和屏幕的显示  log输出如下：   </p>
<pre>06-05 12:38:40.855: INFO/System.out(422): carey test adobe air for android!!!  </pre>
<p>  <a href="http://blog.zhourunsheng.com/wp-content/uploads/2011/07/testair-log.jpg"><img class="alignnone size-full wp-image-260" title="testair-log" src="http://blog.zhourunsheng.com/wp-content/uploads/2011/07/testair-log.jpg" alt="" width="500" height="74" /></a></p>
<p>9. 如果现在手机还没有安装Adobe AIR for Androi的话，屏幕会提示是否需要安装，</p>
<p> <a href="http://blog.zhourunsheng.com/wp-content/uploads/2011/07/install-adobe-info.jpg"><img class="alignnone size-full wp-image-261" title="install-adobe-info" src="http://blog.zhourunsheng.com/wp-content/uploads/2011/07/install-adobe-info.jpg" alt="" width="320" height="480" /></a></p>
<p> <a href="http://carey-blog-image.googlecode.com/files/Adobe%20AIR%20for%20Android_2.6.0.1915.apk" target="_blank">Adobe AIR for Android_2.6.0.1915.apk  下载</a>  </p>
<p>10. 如果安装过程中出现 Failure [INSTALL_FAILED_INVALID_APK] 的错误   </p>
<p>     解决方法如下：   </p>
<p>     there is a change when creating an apk for a device or an emulator.   </p>
<p>     So adt.exe/jar is ok, you just need to provide different -target value, i.e.:    </p>
<p>     <strong>1. </strong>  For physical device:       <br />
           
<pre> adt.bat -package -target apk -storetype pkcs12 -keystore [keystore_positon] mobitest.apk MobileEmuTest-app.xml .   </pre>
<p>    <strong> 2.</strong>   For emulator:       <br />
           
<pre>adt.bat -package -target apk-emulator -storetype pkcs12 -keystore [keystore_positon] mobitest.apk MobileEmuTest-app.xml .  </pre>
<p>     或者</p>
<p>     修改 build.xml 如下： </p>
<p>     change      </p>
<pre> &lt;property name="apk.target" value="apk"/&gt;  </pre>
<p>      to      </p>
<pre> &lt;property name="apk.target" value="apk-emulator"/&gt; </pre>
<p>     in build.xml file, and can install on the emulator device</p>
<p><a href="http://carey-blog-image.googlecode.com/files/TestAIR_source.zip" target="_blank">本文源代码 下载</a></p>
<p><a rel="nofollow" href="http://blog.zhourunsheng.com/2011/07/air-for-android/">AIR for Android</a>，首发于<a rel="nofollow" href="http://blog.zhourunsheng.com">润物无声</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zhourunsheng.com/2011/07/air-for-android/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Extending AIR for Android (4)</title>
		<link>http://blog.zhourunsheng.com/2011/07/extending-air-for-android-4/</link>
		<comments>http://blog.zhourunsheng.com/2011/07/extending-air-for-android-4/#comments</comments>
		<pubDate>Sat, 02 Jul 2011 07:35:06 +0000</pubDate>
		<dc:creator><![CDATA[润物无声]]></dc:creator>
				<category><![CDATA[移动开发]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://blog.zhourunsheng.com/?p=253</guid>
		<description><![CDATA[<p>Application Licensing Android provides APIs to help you [&#8230;]</p>
<p><a rel="nofollow" href="http://blog.zhourunsheng.com/2011/07/extending-air-for-android-4/">Extending AIR for Android (4)</a>，首发于<a rel="nofollow" href="http://blog.zhourunsheng.com">润物无声</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p><strong>Application Licensing</strong></p>
<p>Android provides APIs to help you enforce licensing policies for non-free apps in the Android Market. You might want to go read up on<a href="http://developer.android.com/guide/publishing/licensing.html" target="_blank"> Android Licensing</a> before you give this one a try.<br />
To add Application Licensing to you AIR for Android application you first need to follow the steps outlined in the Android documentation. The broad steps are as follows:<br />
<strong>1.</strong> Set up an Android Market publisher account</p>
<p><strong>2.</strong> Install the Market Licensing Package in the Android SDK</p>
<p><strong>3.</strong> Create a new LVL Android Library Project in Eclipse</p>
<p><strong>4.</strong> Add a Library reference in the Android project to the LVL Android Library</p>
<p><strong>5.</strong> Add the CHECK_LICENSE permission to your Android project’s manifest file:</p>
<pre>&lt;uses-permission android:name="com.android.vending.CHECK_LICENSE" /&gt;</pre>
<p>After completing these set up steps, you are ready to update the MainApp Java class to handle validating the license:</p>
<pre>package com.jamesward;   
import com.android.vending.licensing.AESObfuscator;
import com.android.vending.licensing.LicenseChecker;
import com.android.vending.licensing.LicenseCheckerCallback;
import com.android.vending.licensing.ServerManagedPolicy;   
import air.Foo.AppEntry;
import android.os.Bundle;
import android.os.Handler;
import android.provider.Settings.Secure;   

public class MainApp extends AppEntry {
   private static final String BASE64_PUBLIC_KEY = "REPLACE WITH KEY FROM ANDROID MARKET PROFILE";       
   // Generate your own 20 random bytes, and put them here.    
   private static final byte[] SALT = new byte[] {        
  -45, 12, 72, -31, -8, -122, 98, -24, 86, 47, -65, -47, 33, -99, -55, -64, -114, 39, -71, 47    };       
   private LicenseCheckerCallback mLicenseCheckerCallback;    
   private LicenseChecker mChecker;    
   private Handler mHandler;       
  
   @Override   
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);        
   mHandler = new Handler();        
   String deviceId = Secure.getString(getContentResolver(), Secure.ANDROID_ID);        
   mLicenseCheckerCallback = new MyLicenseCheckerCallback();        
  
   mChecker = new LicenseChecker(  this, new ServerManagedPolicy(this,
         new AESObfuscator(SALT, getPackageName(), deviceId)),  BASE64_PUBLIC_KEY);        
   mChecker.checkAccess(mLicenseCheckerCallback);    
   }       
  
   private void displayFault() {        
      mHandler.post(new Runnable() {          
         public void run() {                
      // Cover the screen with a messaging indicating there was a licensing problem                
      setContentView(R.layout.main);            
    }        
   });    
   }       
  
   private class MyLicenseCheckerCallback implements LicenseCheckerCallback {        
       public void allow() {            
        if (isFinishing()) {                
        // Don't update UI if Activity is finishing.                
     return;            
      }            
      // Should allow user access.        
    }           
   
    public void dontAllow() {            
        if (isFinishing()) {                
        // Don't update UI if Activity is finishing.                
        return;            
     }           
     displayFault();        
    }           
   
    public void applicationError(ApplicationErrorCode errorCode) {            
        if (isFinishing()) {                
         // Don't update UI if Activity is finishing.                
         return;            
     }        
  }    
 }       
 
 @Override   
 protected void onDestroy() {        
     super.onDestroy();        
     mChecker.onDestroy();    
 }
}</pre>
<p>Also add the following to a new res/layout/main.xml file in order to display an error when the license is denied:</p>
<pre>&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
                android:orientation="vertical" 
                android:layout_width="fill_parent"    
                android:layout_height="fill_parent"    &gt;   

       &lt;TextView      android:layout_width="fill_parent"     
                              android:layout_height="wrap_content"     
                              android:text="@string/license_problem"    /&gt; 
&lt;/LinearLayout&gt;</pre>
<p>The text to display uses a string resource named “license_problem”, which must be added to the res/values/strings.xml file:</p>
<pre>&lt;string name="license_problem"&gt;THERE WAS A PROBLEM LICENSING YOUR APPLICATION!&lt;/string&gt;</pre>
<p>When the application runs it will check for a valid license. If the license comes back as valid then the AIR application will start and run as usual. However, if there is an invalid license then the application will set the ContentView to the R.layout.main resource, which displays the error message defined in the “license_problem” resource. To simulate different responses you can change the “Test Response” in your Android Market profile.</p>
<p><strong>The Gory Details</strong></p>
<p>I’ve wrapped up a generated AppEntry class and its resources to make the process of extending AIR for Android fairly easy. If you are interested in seeing how that is done, I’ve posted all of the <a href="https://github.com/jamesward/extending_air_for_android" target="_blank">source code on github.</a></p>
<p>Here is an overview of the procedure:</p>
<p>1. Use the AIR SDK to create an AIR for Android APK file.<br />
2. Use the dex2jar utility to convert the AppEntry dex classes into a JAR file.<br />
3. Pull the resource classes out of the JAR file so that they don’t conflict with the new resources.<br />
4. Use apktool to extract the original resources out of the AIR for Android APK file.<br />
5. Create a single ZIP file containing the airbootstap.jar file, resources, AndroidManifest.xml file, and assets.<br />
Now you can simply copy and paste those dependencies into your Android project.</p>
<p><strong>Conclusion</strong><br />
Hopefully this article has helped you to better understand how you can extend AIR for Android applications with Android APIs. There are still a number of areas where this method can be improved. For instance, I am currently working with the<a href="http://code.google.com/p/merapi/" target="_blank"> Merapi Project</a> developers to get Merapi working with my method of extending AIR for Android. That will provide a better bridging technique for communicating between the AIR application and Android APIs. So stay tuned for more information about that. And let me know if you have any questions!</p>
<p>原文作者: <a href="http://www.jamesward.com/" target="_blank">James Ward</a></p>
<p><a rel="nofollow" href="http://blog.zhourunsheng.com/2011/07/extending-air-for-android-4/">Extending AIR for Android (4)</a>，首发于<a rel="nofollow" href="http://blog.zhourunsheng.com">润物无声</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zhourunsheng.com/2011/07/extending-air-for-android-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Extending AIR for Android (3)</title>
		<link>http://blog.zhourunsheng.com/2011/07/extending-air-for-android-3/</link>
		<comments>http://blog.zhourunsheng.com/2011/07/extending-air-for-android-3/#comments</comments>
		<pubDate>Sat, 02 Jul 2011 07:24:28 +0000</pubDate>
		<dc:creator><![CDATA[润物无声]]></dc:creator>
				<category><![CDATA[移动开发]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://blog.zhourunsheng.com/?p=238</guid>
		<description><![CDATA[<p>Widgets Widgets in Android are the mini apps that can b [&#8230;]</p>
<p><a rel="nofollow" href="http://blog.zhourunsheng.com/2011/07/extending-air-for-android-3/">Extending AIR for Android (3)</a>，首发于<a rel="nofollow" href="http://blog.zhourunsheng.com">润物无声</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p><strong>Widgets</strong></p>
<p><strong></strong><br />
Widgets in Android are the mini apps that can be displayed on the home screen of the device. There is a fairly limited amount of things that can be displayed in Widgets. So unfortunately Widgets can’t be built with AIR for Android. However a custom application Widget can be packaged with an AIR for Android application. To add a Widget to an AIR for Android application you can use the default AppEntry class instead of wrapping it with another class (MainApp in my example). (It doesn’t, however, do any harm to keep the MainApp class there.) To add a Widget simply add its definition to the AndroidManifest.xml file, create the Widget with Java, and create a corresponding layout resource.</p>
<p><strong>1. </strong>First define the Widget in the application section of the AndroidManifest.xml file:</p>
<pre>&lt;receiver android:name=".AndroidWidget" android:label="app"&gt;
    &lt;intent-filter&gt;
         &lt;action android:name="android.appwidget.action.APPWIDGET_UPDATE" /&gt;
   &lt;/intent-filter&gt;
   &lt;meta-data android:name="android.appwidget.provider" android:resource="@xml/airandroidwidget" /&gt;
&lt;/receiver&gt;</pre>
<p><strong>2. </strong>You need an XML resource that provides metadata about the widget. Simply create a new file named airandroidwidget.xml in a new res/xml directory with the following contents:</p>
<pre>&lt;?xml version="1.0" encoding="utf-8"?&gt;    
&lt;appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
            android:minWidth="294dp"
            android:minHeight="72dp"
            android:updatePeriodMillis="86400000"
            android:initialLayout="@layout/main"&gt;
&lt;/appwidget-provider&gt;</pre>
<p>This tells the widget to use the main layout resource as the initial layout for the widget.</p>
<p><strong>3.</strong> Create a res/layout/main.xml file that contains a simple text display:</p>
<pre>&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                             android:id="@+id/widget"
                             android:orientation="vertical"
                             android:layout_width="fill_parent"
                             android:layout_height="fill_parent"
                             android:background="#ffffffff"    &gt;
          &lt;TextView  android:layout_width="fill_parent"
                             android:layout_height="wrap_content"
                             android:text="hello"    /&gt;
 &lt;/LinearLayout&gt;</pre>
<p>Next, you’ll need to create the AppWidgetProvider class specified in the AndroidManifest.xml file.<br />
 </p>
<p><strong>4. </strong>Create a new Java class named AndroidWidget with the following contents:</p>
<pre>package com.jamesward;   
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;
import com.jamesward.MainApp;   

public class AndroidWidget extends AppWidgetProvider {
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)     {        
     final int N = appWidgetIds.length;           
  // Perform this loop procedure for each App Widget that belongs to this provider        
  
  for (int i = 0; i &lt; N; i++)  {            
     int appWidgetId = appWidgetIds[i];            
     Intent intent = new Intent(context, MainApp.class);            
     intent.setAction(Intent.ACTION_MAIN);            
     PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);            
    
     RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.main);            
     views.setOnClickPendingIntent(R.id.widget, pendingIntent);            
     appWidgetManager.updateAppWidget(appWidgetId, views);        
  }    
    }
}</pre>
<p>This class will display the Widget when necessary and register a click handler that will open the MainApp application when the user taps on the Widget.</p>
<p><strong>5.</strong> Run the application to verify that it works.</p>
<p><strong>6.</strong> Now you can add the widget to the home screen by holding down on the home screen and following the Widget wizard.</p>
<p><strong>7.</strong> Verify that tapping the widget launches the AIR application.</p>
<p>原文作者: <a href="http://www.jamesward.com/" target="_blank">James Ward</a></p>
<p><a rel="nofollow" href="http://blog.zhourunsheng.com/2011/07/extending-air-for-android-3/">Extending AIR for Android (3)</a>，首发于<a rel="nofollow" href="http://blog.zhourunsheng.com">润物无声</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zhourunsheng.com/2011/07/extending-air-for-android-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Extending AIR for Android (2)</title>
		<link>http://blog.zhourunsheng.com/2011/07/extending-air-for-android-2/</link>
		<comments>http://blog.zhourunsheng.com/2011/07/extending-air-for-android-2/#comments</comments>
		<pubDate>Sat, 02 Jul 2011 07:11:56 +0000</pubDate>
		<dc:creator><![CDATA[润物无声]]></dc:creator>
				<category><![CDATA[移动开发]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://blog.zhourunsheng.com/?p=230</guid>
		<description><![CDATA[<p>System Notifications and Services AIR for Android appli [&#8230;]</p>
<p><a rel="nofollow" href="http://blog.zhourunsheng.com/2011/07/extending-air-for-android-2/">Extending AIR for Android (2)</a>，首发于<a rel="nofollow" href="http://blog.zhourunsheng.com">润物无声</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p><strong>System Notifications and Services</strong></p>
<p>AIR for Android applications don’t yet have an API to do Android system notifications. But you can add system notifications to your AIR for Android application through a startup hook. In order for the AIR application to communicate with the native Android APIs you must provide a bridge for the communication. The simplest way to create that bridge is using a network socket. The Android application can listen for data on the socket and then read that data and determine if it needs to display a system notification. Then the AIR application can connect to the socket and send the necessary data. This is a pretty straightforward example but some security (for instance a key exchange) should be implemented to insure that malicious apps don’t discover and abuse the socket. Also some logic to determine which socket should be used would likely be necessary.</p>
<p><strong>1.</strong> Inside the application section add a new Android Service:</p>
<pre>   &lt;service android:enabled="true" android:name="TestService" /&gt;</pre>
<p><strong>2.</strong> Since this example uses a Socket you will also need to add the INTERNET permission:</p>
<pre>   &lt;uses-permission android:name="android.permission.INTERNET"/&gt;</pre>
<p><strong>3.</strong> You might also want to enable the phone to vibrate when there is a new notification. If so add that permission as well:</p>
<pre>   &lt;uses-permission android:name="android.permission.VIBRATE"/&gt;</pre>
<p><strong>4.</strong> Save your changes to AndroidManifest.xml.</p>
<p><strong>5.</strong> Next, create the background Java Service class, called TestService. This service will listen on a socket and when necessary, display an Android Notification:</p>
<pre>package com.jamesward;   
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;   
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.os.Looper;
import android.util.Log;   

public class TestService extends Service {  
    private boolean stopped=false;  
 private Thread serverThread;  
 private ServerSocket ss;     

 @Override 
 public IBinder onBind(Intent intent){ 
       return null;  
 }     

 @Override  public void onCreate()   {
        super.onCreate();       
  Log.d(getClass().getSimpleName(), "onCreate");         

  serverThread = new Thread(new Runnable() {           
         public void run()  {                
           try  {                        
         Looper.prepare();                        
      ss = new ServerSocket(12345);                        
      ss.setReuseAddress(true);                        
      ss.setPerformancePreferences(100, 100, 1);                        

      while (!stopped)   {   
          Socket accept = ss.accept();                                
       accept.setPerformancePreferences(10, 100, 1);                                
       accept.setKeepAlive(true);                                   
       DataInputStream _in = null;                                

       try   {                                        
           _in = new DataInputStream(new BufferedInputStream(accept.getInputStream(),1024));  
       }  catch (IOException e2)  {                                  
           e2.printStackTrace();                                
       }                                   

       int method =_in.readInt();                                   
       switch (method) {                                  
        // notification                                  
        case 1: 
            doNotification(_in);
         break;                                
          }                        
      }                
     }   catch (Throwable e)  {                        
         e.printStackTrace();                        
      Log.e(getClass().getSimpleName(), "Error in Listener",e);                
     }                   

     try {                  
         ss.close();                
     }  catch (IOException e)  {                  
         Log.e(getClass().getSimpleName(), "keep it simple");                
     }        
    }           
   },"Server thread");      

  serverThread.start();     
 }     

 private void doNotification(DataInputStream in) throws IOException {    
      String id = in.readUTF();    
   displayNotification(id);  
    }     

 @Override 
 public void onDestroy() {          
    stopped=true;          
    try {                  
       ss.close();          
    } catch (IOException e) {}          

    serverThread.interrupt();          

    try {                  
       serverThread.join();          
    } catch (InterruptedException e) {}  
 }     

 public void displayNotification(String notificationString)   {    
     int icon = R.drawable.mp_warning_32x32_n;    
  CharSequence tickerText = notificationString;    
  long when = System.currentTimeMillis();    
  Context context = getApplicationContext();    
  CharSequence contentTitle = notificationString;    
  CharSequence contentText = "Hello World!";       
  Intent notificationIntent = new Intent(this, MainApp.class);    
  PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);       
  Notification notification = new Notification(icon, tickerText, when);    
  notification.vibrate = new long[] {0,100,200,300};       
  notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);       
  String ns = Context.NOTIFICATION_SERVICE;    

  NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);       
  mNotificationManager.notify(1, notification);  
 }   
}</pre>
<p>This service listens on port 12345. When it receives some data it checks if the first “int” sent is “1”. If so, it then creates a new notification using the next piece of data (a string) that is received over the socket.</p>
<p><strong>6.</strong> Modify the MainApp Java class to start the service when the onCreate() method is called:</p>
<pre>@Override   
public void onCreate(Bundle savedInstanceState) {        
   try {            
      Intent srv = new Intent(this, TestService.class);            
   startService(srv);        
   }  catch (Exception e)  {            
     // service could not be started        
   }           

   super.onCreate(savedInstanceState);    
}</pre>
<p>That is all you need to do in the Android application.</p>
<p><strong>7.</strong> Next, create a Flex application that will connect to the socket and send the right data. Here is some sample code for my Notifier.mxml class, which I used to test the Android service:</p>
<pre>  &lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"  xmlns:s="library://ns.adobe.com/flex/spark"&gt;   
     &lt;fx:Style&gt;    @namespace s "library://ns.adobe.com/flex/spark";    
            global {  fontSize: 32;   } 
     &lt;/fx:Style&gt;  

     &lt;s:layout&gt;   
         &lt;s:VerticalLayout horizontalAlign="center" paddingTop="20"/&gt;  
     &lt;/s:layout&gt;   

     &lt;s:TextInput id="t" text="test test"/&gt;   
     &lt;s:Button label="create notification"&gt;  

     &lt;s:click&gt;   
       &lt;![CDATA[        
              var s:Socket = new Socket();       
              s.connect("localhost", 12345);       
              s.addEventListener(Event.CONNECT, function(event:Event):void {         
                                             trace('connected!');          
                                             (event.currentTarget as Socket).writeInt(1);         
                                             (event.currentTarget as Socket).writeUTF(t.text);         
                                             (event.currentTarget as Socket).flush();         
                                             (event.currentTarget as Socket).close();        });      

               s.addEventListener(IOErrorEvent.IO_ERROR, function(event:IOErrorEvent):void {      
                                               trace('error! ' + event.errorID);        });      

               s.addEventListener(ProgressEvent.SOCKET_DATA, function(event:ProgressEvent):void {        
                                               trace('progress ');        });    

            ]]&gt;   

     &lt;/s:click&gt;  

     &lt;/s:Button&gt;

    &lt;/s:Application&gt;</pre>
<p>As you can see there is just a TextInput control that allows the user to enter some text. Then when the user clicks the Button the AIR for Android application connects to a local socket on port 12345, writes an int with the value of 1, writes the string that the user typed into the TextInput control, and finally flushes and closes the connection. This causes the notification to be displayed.</p>
<p><strong>8.</strong> Now simply compile the Flex app and overwrite the assets/app.swf file with the new Flex application. Check out a <a href="http://www.youtube.com/watch?v=HjDu66NOpuA" target="_blank">video demonstration</a> of this code.</p>
<p>原文作者：<a href="http://www.jamesward.com/" target="_blank">james ward</a></p>
<p><a rel="nofollow" href="http://blog.zhourunsheng.com/2011/07/extending-air-for-android-2/">Extending AIR for Android (2)</a>，首发于<a rel="nofollow" href="http://blog.zhourunsheng.com">润物无声</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zhourunsheng.com/2011/07/extending-air-for-android-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Extending AIR for Android (1)</title>
		<link>http://blog.zhourunsheng.com/2011/07/extending-air-for-android-1/</link>
		<comments>http://blog.zhourunsheng.com/2011/07/extending-air-for-android-1/#comments</comments>
		<pubDate>Sat, 02 Jul 2011 06:47:46 +0000</pubDate>
		<dc:creator><![CDATA[润物无声]]></dc:creator>
				<category><![CDATA[移动开发]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://blog.zhourunsheng.com/?p=221</guid>
		<description><![CDATA[<p>Adobe AIR provides a consistent platform for desktop an [&#8230;]</p>
<p><a rel="nofollow" href="http://blog.zhourunsheng.com/2011/07/extending-air-for-android-1/">Extending AIR for Android (1)</a>，首发于<a rel="nofollow" href="http://blog.zhourunsheng.com">润物无声</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>Adobe AIR provides a consistent platform for desktop and mobile apps. While consistency is very important there are times when developers need to extend beyond the common APIs. This article will walk you through how to integrate AIR for Android applications with other native APIs and functionality in the Android SDK. It covers three common use cases for native extensibility: System Notifications, Widgets, and Application Licensing.</p>
<p>If you’d like to follow along you will need the following prerequisites:</p>
<p><strong>1.<a href="https://www.adobe.com/cfusion/tdrc/index.cfm?product=flash_builder" target="_blank"> </a></strong><a href="https://www.adobe.com/cfusion/tdrc/index.cfm?product=flash_builder" target="_blank">Adobe Flash Builder 4.5</a>(which includes the Flex 4.5 SDK and AIR 2.6 SDK)</p>
<p><strong>2. </strong><a href="http://developer.android.com/sdk/index.html" target="_blank">Android SDK </a></p>
<p><strong>3.</strong><a href="http://developer.android.com/sdk/eclipse-adt.html" target="_blank"> Android Eclipse Plugin</a></p>
<p>Before getting started, a little background will help. Android applications are distributed as APK files. An APK file contains the Dalvik executable (dex), which will run on an Android device inside the Dalvik VM. The Android SDK compiles a Java-like language to dex.</p>
<p>AIR for Android applications are also distributed as APK files. Inside of these APK files is a small bit of dex that bootstraps the AIR for Android runtime, which then loads and runs the SWF file that is also inside of the APK. The actual dex class that bootstraps the AIR application is dynamically generated by the adt tool in the AIR SDK. The class is named AppEntry and its package name depends on the AIR application ID, but it always begins with “air”. The AppEntry class checks for the existence of the AIR runtime and then launches the AIR application. The Android descriptor file in an AIR APK specifies that the main application class is the AppEntry class.</p>
<p>To extend AIR for Android applications to include native APIs and Android SDK functionality, you start by creating a SWF file using Flex and then copy that SWF file, the dex classes for AIR for Android, and the required resources into a standard Android project. By using the original AppEntry class you can still bootstrap the AIR application in the Android project but you can extend that class to gain a startup hook.</p>
<p><strong>1.</strong> To get started, download a package with the required dependencies for extending AIR for Android:</p>
<p>download here <a href="http://www.jamesward.com/downloads/extending_air_for_android-flex_4_5-air_2_6-v_1.zip" target="_blank">extending_air_for_android-flex_4_5-air_2_6-v_1.zip</a></p>
<p><strong>2.</strong> Next, create a regular Android project in Eclipse (do not create an Activity yet):</p>
<p><a href="http://blog.zhourunsheng.com/wp-content/uploads/2011/07/test-air-eclipse.jpg"><img class="alignnone size-full wp-image-222" title="test-air-eclipse" src="http://blog.zhourunsheng.com/wp-content/uploads/2011/07/test-air-eclipse.jpg" alt="" width="339" height="500" /></a></p>
<p><strong>3. </strong>Copy all of the files from the zip file you downloaded into the root directory of the newly created Android project. You will need to overwrite the existing files and update the launch configuration (if Eclipse asks you to).</p>
<p><strong>4.</strong> Delete the “res/layout” directory.</p>
<p><strong>5.</strong> Add the airbootstrap.jar file to the project’s build path. You can do that by right-clicking on the file, then select Build Path and then Add to Build Path.</p>
<p><strong>6.</strong> Verify that the project runs. You should see “hello, world” on your Android device. If so, then the AIR application is properly being bootstrapped and the Flex application in assets/app.swf is correctly being run.</p>
<p>At this point if you do not need any custom startup hooks then you can simply replace the assets/app.swf file with your own SWF file (but it must be named app.swf). If you do need a custom startup hook then simply create a new Java class named “MainApp” that extends the air.app.AppEntry class.</p>
<p><a href="http://blog.zhourunsheng.com/wp-content/uploads/2011/07/new-class.jpg"><img class="alignnone size-full wp-image-223" title="new-class" src="http://blog.zhourunsheng.com/wp-content/uploads/2011/07/new-class.jpg" alt="" width="453" height="500" /></a></p>
<p><strong>7.</strong> Override the onCreate() method and add your own startup logic before super.onCreate() is called (which loads the AIR app). Here is an example:</p>
<pre>package com.jamesward;
import air.app.AppEntry;
import android.os.Bundle;
public class MainApp extends AppEntry {
   @Override
   public void onCreate(Bundle arg0) {
       System.out.println("test test");
       super.onCreate(arg0);
   }
}</pre>
<p><strong>8.</strong> Open the AndroidManifest.xml descriptor file and tell it to use the new MainApp class instead of the original AppEntry class. First change the package to be the same as your MainApp’s package:</p>
<pre>&lt;manifest package="com.jamesward" android:versionCode="1000000" android:versionName="1.0.0"
  xmlns:android="&lt;a href="http://schemas.android.com/apk/res/android"&gt;http://schemas.android.com/apk/res/android&lt;/a&gt;"&gt;</pre>
<p>Also update the activity to use the MainApp class (make sure you have the period before the class name):</p>
<pre>&lt;activity android:name=".MainApp" ...&gt;</pre>
<p>You can also add any other permissions or settings you might need in the AndroidManifest.xml file.</p>
<p><strong>9.</strong> Save the changes and, when Eclipse prompts you, update the launch configuration.</p>
<p><strong>10. </strong>Run the application and you should again see “hello, world”. This time, however, in LogCat (command line tool or Eclipse view) you should see the “test test” output. Now that you have a startup hook, you can do some fun stuff!</p>
<p>原文作者：<a href="http://www.jamesward.com/" target="_blank">James Ward</a></p>
<p><a rel="nofollow" href="http://blog.zhourunsheng.com/2011/07/extending-air-for-android-1/">Extending AIR for Android (1)</a>，首发于<a rel="nofollow" href="http://blog.zhourunsheng.com">润物无声</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zhourunsheng.com/2011/07/extending-air-for-android-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
