从 Adobe AIR 扩展连接到主应用程序的 onCreate 方法
Hooking into main application's onCreate method from Adobe AIR extension
我正在为 Urban Airship 创建一个 ANE,这是一项用于发送推送通知(以及其他内容)的服务。到目前为止,集成效果很好,但只有在应用程序打开时才有效。退出应用程序时,收到新的推送通知会导致应用程序崩溃:
11-29 01:19:32.448 22340-22340/air.com.example.app E/Urban Airship Autopilot: Unable to takeOff automatically
11-29 01:19:32.496 22340-22440/air.com.example.app E/AndroidRuntime: FATAL EXCEPTION: IntentService[PushService]
Process: air.com.example.app, PID: 22340
java.lang.IllegalStateException: Take off must be called before shared()
at com.urbanairship.UAirship.shared(UAirship.java:147)
at com.urbanairship.BaseIntentService.onHandleIntent(BaseIntentService.java:94)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java)
at android.os.Handler.dispatchMessage(Handler.java)
at android.os.Looper.loop(Looper.java)
at android.os.HandlerThread.run(HandlerThread.java)
通过大量挖掘,我认为问题在于我是从 TakeoffFunction(我的 ANE 中的一个 FREFunction)中调用 UAirship.takeOff() 而不是从应用程序的主要 onCreate 方法中调用它(原样问题见于:UrbanAirship NPE)
这是我的 TakeoffFunction:
public class TakeoffFunction implements FREFunction
{
@Override
public FREObject call(FREContext context, FREObject[] freObjects)
{
Log.d("TakeoffFunction", "Attempting Urban Airship TAKEOFF");
Application app = context.getActivity().getApplication();
Log.d("TakeoffFunction", "app found: " + app);
AirshipConfigOptions options = new AirshipConfigOptions();
options.developmentAppKey = "xxx";
options.developmentAppSecret = "xxx";
options.inProduction = false;
options.gcmSender = "000";
Log.d("TakeoffFunction", "Prepare to Launch...");
UAirship.takeOff(app, options, new UAirship.OnReadyCallback()
{
@Override
public void onAirshipReady(UAirship uAirship)
{
Log.d("TakeoffFunction", "Urban Airship is ready after takeoff");
uAirship.getPushManager().setUserNotificationsEnabled(true);
Log.d("TakeoffFunction", "User notifications have been enabled");
}
});
return null;
}
}
因此,我似乎需要以某种方式从主应用程序的 onCreate 方法中调用 UAirship.takeOff()。然而,这被证明是一个挑战,因为我知道对于 Adobe AIR,有一个 AppEntry class 作为主应用程序 class,但是这个 class 是,就我知道,禁止对开发人员进行修改。我在 2011 年正式支持本机扩展之前找到了这个教程:http://blogs.adobe.com/digitalmedia/2011/05/extending-air-for-android/。在那里我看到他们能够覆盖和扩展 onCreate() 方法,但我不知道我将如何使用这个本机扩展来做同样的事情。
我想知道是否可以扩展 AppEntry 的 onCreate 方法或将 AIR 指向不同的 AppEntry class 完全覆盖原来的。
在创建所有服务、接收器或活动之前,通常会看到库希望让应用程序在应用程序的 onCreate 中初始化其模块。基本上是所有应用程序的唯一真正入口点。
对于像 Adobe 这样难以在应用程序文件中调用 takeoff 的框架,我们添加了另一种使用 Autopilot.
调用 takeoff 的方法
示例:
public class AirAutopilot extends Autopilot {
@Override
public AirshipConfigOptions createAirshipConfigOptions(Context context) {
AirshipConfigOptions options = new AirshipConfigOptions();
options.developmentAppKey = "xxx";
options.developmentAppSecret = "xxx";
options.inProduction = false;
options.gcmSender = "000";
return options;
}
@Override
public void onAirshipReady(UAirship airship) {
Log.d("TakeoffFunction", "Urban Airship is ready after takeoff");
airship.getPushManager().setUserNotificationsEnabled(true);
Log.d("TakeoffFunction", "User notifications have been enabled");
}
}
然后将自动驾驶仪 class 添加到应用程序块中的清单(不确定 Adobe Air 的执行方式):
<meta-data android:name="com.urbanairship.autopilot" android:value="com.example.AirAutopilot" />
然后在您的插件中,确保在访问 UAirship 实例之前调用自动驾驶仪:
Autopilot.automaticTakeOff(context.getActivity().getApplication());
我正在为 Urban Airship 创建一个 ANE,这是一项用于发送推送通知(以及其他内容)的服务。到目前为止,集成效果很好,但只有在应用程序打开时才有效。退出应用程序时,收到新的推送通知会导致应用程序崩溃:
11-29 01:19:32.448 22340-22340/air.com.example.app E/Urban Airship Autopilot: Unable to takeOff automatically
11-29 01:19:32.496 22340-22440/air.com.example.app E/AndroidRuntime: FATAL EXCEPTION: IntentService[PushService]
Process: air.com.example.app, PID: 22340
java.lang.IllegalStateException: Take off must be called before shared()
at com.urbanairship.UAirship.shared(UAirship.java:147)
at com.urbanairship.BaseIntentService.onHandleIntent(BaseIntentService.java:94)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java)
at android.os.Handler.dispatchMessage(Handler.java)
at android.os.Looper.loop(Looper.java)
at android.os.HandlerThread.run(HandlerThread.java)
通过大量挖掘,我认为问题在于我是从 TakeoffFunction(我的 ANE 中的一个 FREFunction)中调用 UAirship.takeOff() 而不是从应用程序的主要 onCreate 方法中调用它(原样问题见于:UrbanAirship NPE)
这是我的 TakeoffFunction:
public class TakeoffFunction implements FREFunction
{
@Override
public FREObject call(FREContext context, FREObject[] freObjects)
{
Log.d("TakeoffFunction", "Attempting Urban Airship TAKEOFF");
Application app = context.getActivity().getApplication();
Log.d("TakeoffFunction", "app found: " + app);
AirshipConfigOptions options = new AirshipConfigOptions();
options.developmentAppKey = "xxx";
options.developmentAppSecret = "xxx";
options.inProduction = false;
options.gcmSender = "000";
Log.d("TakeoffFunction", "Prepare to Launch...");
UAirship.takeOff(app, options, new UAirship.OnReadyCallback()
{
@Override
public void onAirshipReady(UAirship uAirship)
{
Log.d("TakeoffFunction", "Urban Airship is ready after takeoff");
uAirship.getPushManager().setUserNotificationsEnabled(true);
Log.d("TakeoffFunction", "User notifications have been enabled");
}
});
return null;
}
}
因此,我似乎需要以某种方式从主应用程序的 onCreate 方法中调用 UAirship.takeOff()。然而,这被证明是一个挑战,因为我知道对于 Adobe AIR,有一个 AppEntry class 作为主应用程序 class,但是这个 class 是,就我知道,禁止对开发人员进行修改。我在 2011 年正式支持本机扩展之前找到了这个教程:http://blogs.adobe.com/digitalmedia/2011/05/extending-air-for-android/。在那里我看到他们能够覆盖和扩展 onCreate() 方法,但我不知道我将如何使用这个本机扩展来做同样的事情。
我想知道是否可以扩展 AppEntry 的 onCreate 方法或将 AIR 指向不同的 AppEntry class 完全覆盖原来的。
在创建所有服务、接收器或活动之前,通常会看到库希望让应用程序在应用程序的 onCreate 中初始化其模块。基本上是所有应用程序的唯一真正入口点。
对于像 Adobe 这样难以在应用程序文件中调用 takeoff 的框架,我们添加了另一种使用 Autopilot.
调用 takeoff 的方法示例:
public class AirAutopilot extends Autopilot {
@Override
public AirshipConfigOptions createAirshipConfigOptions(Context context) {
AirshipConfigOptions options = new AirshipConfigOptions();
options.developmentAppKey = "xxx";
options.developmentAppSecret = "xxx";
options.inProduction = false;
options.gcmSender = "000";
return options;
}
@Override
public void onAirshipReady(UAirship airship) {
Log.d("TakeoffFunction", "Urban Airship is ready after takeoff");
airship.getPushManager().setUserNotificationsEnabled(true);
Log.d("TakeoffFunction", "User notifications have been enabled");
}
}
然后将自动驾驶仪 class 添加到应用程序块中的清单(不确定 Adobe Air 的执行方式):
<meta-data android:name="com.urbanairship.autopilot" android:value="com.example.AirAutopilot" />
然后在您的插件中,确保在访问 UAirship 实例之前调用自动驾驶仪:
Autopilot.automaticTakeOff(context.getActivity().getApplication());