在Cordova插件中创建自定义的android.app.Application

3

我是Cordova插件的新手。我想知道在Android中是否可以在我的插件中创建一个自定义的android.app.Application?谢谢。

1个回答

7

这是可能的,但您需要在AndroidManifest.xml<application>元素中添加一个应用程序类的名称引用。

一种方法是使用after_prepare钩子脚本,在每次Cordova准备操作后将其应用于清单。例如:

plugin.xml

<plugin xmlns="http://www.phonegap.com/ns/plugins/1.0" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    id="cordova-plugin-myplugin" 
    version="1.0.0">

  <name>My Plugin</name>

  <platform name="android">

    <config-file target="config.xml" parent="/*">
      <feature name="MyPlugin" >
        <param name="android-package" value="my.package.MyPlugin"/>
      </feature>
    </config-file>

    <js-module name="MyPlugin" src="myplugin.js">
        <clobbers target="MyPlugin"/>
    </js-module>

    <source-file src="MyPlugin.java" target-dir="src/my/package" />
    <source-file src="MyApplication.java" target-dir="src/my/package" />

    <hook type="after_prepare" src="add_application_name.js" />

  </platform>
</plugin>

add_application_name.js

#!/usr/bin/env node

module.exports = function(context) {

  var APPLICATION_CLASS = "my.package.MyApplication";

  var fs = context.requireCordovaModule('fs'),
      path = context.requireCordovaModule('path');

  var platformRoot = path.join(context.opts.projectRoot, 'platforms/android');
  var manifestFile = path.join(platformRoot, 'AndroidManifest.xml');

  if (fs.existsSync(manifestFile)) {
    fs.readFile(manifestFile, 'utf8', function (err, data) {
      if (err) {
        throw new Error('Unable to find AndroidManifest.xml: ' + err);
      }

      if (data.indexOf(APPLICATION_CLASS) == -1) {
        var result = data.replace(/<application/g, '<application android:name="' + APPLICATION_CLASS + '"');
        fs.writeFile(manifestFile, result, 'utf8', function (err) {
          if (err) throw new Error('Unable to write into AndroidManifest.xml: ' + err);
        })
      }
    });
  }
};

MyApplication.java

package my.package;

import android.app.Application;

public class MyApplication extends Application
{
    public static final String TAG = "MyApplication";

    @Override
    public void onCreate()
    {
        Log.d(TAG, "onCreate()");
        // DO SOME STUFF
        super.onCreate();
    }
}

谢谢。我会尝试一下。还有一个问题。如果可以通过plugin.xml将一些值传递给我的java文件,例如MyApplication.java,那么怎么做呢? - Bagusflyer
你的第二个问题并不容易回答。假设你想在应用程序类的onCreate()中使用这些值,那么在此时Cordova环境尚未初始化,因此必须从Java中进行任何XML解析。plugin.xml没有复制到platforms/android中,因此您需要自我引用来指定它作为源文件,应该将其复制到平台项目中。然后您可以在应用程序类中解析和读取其中的值。 - DaveAlden
你的钩子中哪个变量是 appClass?它抛出了一个错误,似乎在代码片段中没有定义。 - SolveSoul
@SolveSoul 这是一个打字错误:应该是 APPLICATION_CLASS - 在示例片段中已经修复。 - DaveAlden
@ZhouHao 我知道你上次提问已经有一段时间了,但是将数据传递给自定义应用程序类的一种方法是使用BuildConfig。这是Android上的一个特殊类,在构建时生成,您可以使用gradle设置这些变量。有关如何完成此操作的更多详细信息,请参见此处。然后,您将在插件上创建一个.gradle文件,其中包含您需要的变量,并且在应用程序类中,您将使用BuildConfig.NAME_OF_VAR来访问它们。 - João Gonçalves

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接