[AIR接入Android 平台]Ane 生命周期控制

I struggled for a while with this issue and finally found a solution. I haven’t seen it posted anywhere so I thought I would share it here.

  • In ANE extension’s native java project, we include runtimeClasses.jar from AIR’s lib folder (AIR\lib\android\lib), along with FlashRuntimeExtension.jar. This gives us access to AIR’s AndroidActivityWrapper class.

  • Since some interfaces in runtimeClasses are defined as protected, we need to make them accessible to our extension. So we create two interfaces in com.adobe.air package namespace:

ActivityResultCallback.java

package com.adobe.air;
import com.adobe.air.AndroidActivityWrapper;
public abstract interface ActivityResultCallback extends AndroidActivityWrapper.ActivityResultCallback{}

StateChangeCallback.java

package com.adobe.air;
import com.adobe.air.AndroidActivityWrapper;
public abstract interface StateChangeCallback extends AndroidActivityWrapper.StateChangeCallback{
}

  • We can now register some callbacks in our extension:

ExtensionContext.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package com.company.extension;
 import java.util.HashMap;
 import java.util.Map;
 import android.content.Intent;
 import android.content.res.Configuration;
 import com.adobe.air.ActivityResultCallback;
 import com.adobe.air.AndroidActivityWrapper;
 import com.adobe.air.AndroidActivityWrapper.ActivityState;
 import com.adobe.air.StateChangeCallback;
 import com.adobe.fre.FREContext;
 import com.adobe.fre.FREFunction;
 public class ExtensionContext extends FREContext implements ActivityResultCallback
StateChangeCallback{    
     private AndroidActivityWrapper aaw;
 
    public ExtensionContext() {        
        aaw = AndroidActivityWrapper.GetAndroidActivityWrapper();
        aaw.addActivityResultListener( this );
        aaw.addActivityStateChangeListner( this );
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent intent ) {
    } 
    
    @Override 
    publicvoid onActivityStateChanged( ActivityState state ) {        
        switch ( state ) {            
            case STARTED:
            case RESTARTED:
            case RESUMED:
            case PAUSED:
            case STOPPED:
            case DESTROYED:
        }    
     } 
     
    @Override
    public void onConfigurationChanged(Configuration paramConfiguration) 
     } 
     
    @Override
    public Map<String, FREFunction> getFunctions() {       
     Map<String, FREFunction> functionMap = new HashMap<String, FREFunction>();
        return functionMap; 
    } 
    
    @Override 
    public void dispose() {         
    if (aaw!=null) {            
        aaw.removeActivityResultListener( this );
        aaw.removeActivityStateChangeListner( this );
        aaw = null;
        }    
     }
     }

  • I hope this helps anyone.

以上能获取到

1
2
3
4
5
case RESTARTED:
case RESUMED:
case PAUSED:
case STOPPED:
case DESTROYED:

但是ane的加载在Activity第一次呈现后,(也就是说Activity的第一次呈现过程中onCreate,onStart,onResume状态获取不到)。

以上说明Ane的加载在第一次呈现后

如果需要在Activity的onCreate阶段调用一个方法,目前想到以下几种方法:

1.自定义AppEntry,用自己的启动Activity去启动Air。然后修改adt的com.adobe.air.apk下的xml文件的启动名

2.修改runtimeClass,在AndroidActivityWrapper的onCreate中修改

3.直接修改com.adobe.air.apk.Dex下的AppEntry

————————————–blog 修改—————

在Android 的ane 中onPause(),onResume(),onDestroy()等生命周期控制方法:

1.在ANE 本地扩展的java工程中包含runtimeClasses.jar,FlashRuntimeExtension.jar

2.由于runtimeClasses 中很多接口都是受保护的,需要在我们的工程中建一个相同的包名com.adobe.air,然后继承runtimeClass中的接口以便我们使用。

由于runtimeClasses的版本不同可能AndroidActivityWrapper 也需要在com.adobe.air包中请用相同方式处理

以上能获取到

1
2
3
4
5
case RESTARTED:
case RESUMED:
case PAUSED:
case STOPPED:
case DESTROYED:

但是ane的加载在Activity第一次呈现后,(也就是说Activity的第一次呈现过程中onCreate,onStart,onResume状态获取不到)。

以上说明Ane的加载在第一次呈现后

如果需要在Activity的onCreate阶段调用一个方法,目前想到以下几种方法:

1.自定义AppEntry,用自己的启动Activity去启动Air。然后修改adt的com.adobe.air.apk下的xml文件的启动名

2.修改runtimeClass,在AndroidActivityWrapper的onCreate中修改

3.直接修改com.adobe.air.apk.Dex下的AppEntry