我是Cordova插件的新手。我想知道在Android中是否可以在我的插件中创建一个自定义的android.app.Application?谢谢。
这是可能的,但您需要在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();
}
}
onCreate()
中使用这些值,那么在此时Cordova环境尚未初始化,因此必须从Java中进行任何XML解析。plugin.xml没有复制到platforms/android
中,因此您需要自我引用来指定它作为源文件,应该将其复制到平台项目中。然后您可以在应用程序类中解析和读取其中的值。 - DaveAldenappClass
?它抛出了一个错误,似乎在代码片段中没有定义。 - SolveSoulAPPLICATION_CLASS
- 在示例片段中已经修复。 - DaveAlden