cordova与android通信_Cordova混合开发(android)

基于Cordova 8.0.0 Cordova-android 7.0.0

public static class CFragment extends CordovaFragment {

@Override

public void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

loadUrl(launchUrl);

}

}

CordovaFragment

public class CordovaFragment extends Fragment {

public static String TAG = "CordovaFragment";

// The webview for our app

protected CordovaWebView appView;

private static int ACTIVITY_STARTING = 0;

private static int ACTIVITY_RUNNING = 1;

private static int ACTIVITY_EXITING = 2;

// Keep app running when pause is received. (default = true)

// If true, then the JavaScript and native code continue to run in the background

// when another application (activity) is started.

protected boolean keepRunning = true;

// Flag to keep immersive mode if set to fullscreen

protected boolean immersiveMode;

// Read from config.xml:

protected CordovaPreferences preferences;

protected String launchUrl;

protected ArrayList pluginEntries;

protected CordovaInterfaceImpl cordovaInterface;

@Override

public void onCreate(@Nullable Bundle savedInstanceState) {

loadConfig();

String logLevel = preferences.getString("loglevel", "ERROR");

LOG.setLogLevel(logLevel);

LOG.i(TAG, "Apache Cordova native platform version " + CordovaWebView.CORDOVA_VERSION + " is starting");

LOG.d(TAG, "CordovaActivity.onCreate()");

if (!preferences.getBoolean("ShowTitle", false)) {

getActivity().getWindow().requestFeature(Window.FEATURE_NO_TITLE);

}

if (preferences.getBoolean("SetFullscreen", false)) {

LOG.d(TAG, "The SetFullscreen configuration is deprecated in favor of Fullscreen, and will be removed in a future version.");

preferences.set("Fullscreen", true);

}

if (preferences.getBoolean("Fullscreen", false)) {

// NOTE: use the FullscreenNotImmersive configuration key to set the activity in a REAL full screen

// (as was the case in previous cordova versions)

if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) && !preferences.getBoolean("FullscreenNotImmersive", false)) {

immersiveMode = true;

} else {

getActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

WindowManager.LayoutParams.FLAG_FULLSCREEN);

}

} else {

getActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN,

WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);

}

super.onCreate(savedInstanceState);

cordovaInterface = makeCordovaInterface();

if (savedInstanceState != null) {

cordovaInterface.restoreInstanceState(savedInstanceState);

}

}

@Nullable

@Override

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

return appView.getView();

// return super.onCreateView(inflater, container, savedInstanceState);

}

protected void init() {

appView = makeWebView();

createViews();

if (!appView.isInitialized()) {

appView.init(cordovaInterface, pluginEntries, preferences);

}

cordovaInterface.onCordovaInit(appView.getPluginManager());

// Wire the hardware volume controls to control media if desired.

String volumePref = preferences.getString("DefaultVolumeStream", "");

if ("media".equals(volumePref.toLowerCase(Locale.ENGLISH))) {

getActivity().setVolumeControlStream(AudioManager.STREAM_MUSIC);

}

}

@SuppressWarnings("deprecation")

protected void loadConfig() {

ConfigXmlParser parser = new ConfigXmlParser();

parser.parse(getActivity());

preferences = parser.getPreferences();

preferences.setPreferencesBundle(getActivity().getIntent().getExtras());

launchUrl = parser.getLaunchUrl();

pluginEntries = parser.getPluginEntries();

Config.parser = parser;

}

//Suppressing warnings in AndroidStudio

@SuppressWarnings({"deprecation", "ResourceType"})

protected void createViews() {

//Why are we setting a constant as the ID? This should be investigated

appView.getView().setId(100);

appView.getView().setLayoutParams(new FrameLayout.LayoutParams(

ViewGroup.LayoutParams.MATCH_PARENT,

ViewGroup.LayoutParams.MATCH_PARENT));

// setContentView(appView.getView());

if (preferences.contains("BackgroundColor")) {

try {

int backgroundColor = preferences.getInteger("BackgroundColor", Color.BLACK);

// Background of activity:

appView.getView().setBackgroundColor(backgroundColor);

}

catch (NumberFormatException e){

e.printStackTrace();

}

}

appView.getView().requestFocusFromTouch();

}

/**

* Called when the system is about to start resuming a previous activity.

*/

@Override

public void onPause() {

super.onPause();

LOG.d(TAG, "Paused the activity.");

if (this.appView != null) {

// CB-9382 If there is an activity that started for result and main activity is waiting for callback

// result, we shoudn't stop WebView Javascript timers, as activity for result might be using them

boolean keepRunning = this.keepRunning || this.cordovaInterface.activityResultCallback != null;

this.appView.handlePause(keepRunning);

}

}

@Override

public void onResume() {

super.onResume();

LOG.d(TAG, "Resumed the activity.");

if (this.appView == null) {

return;

}

// Force window to have focus, so application always

// receive user input. Workaround for some devices (Samsung Galaxy Note 3 at least)

getActivity().getWindow().getDecorView().requestFocus();

this.appView.handleResume(this.keepRunning);

}

@Override

public void onStop() {

super.onStop();

LOG.d(TAG, "Stopped the activity.");

if (this.appView == null) {

return;

}

this.appView.handleStop();

}

@Override

public void onStart() {

super.onStart();

LOG.d(TAG, "Started the activity.");

if (this.appView == null) {

return;

}

this.appView.handleStart();

}

@Override

public void onDestroy() {

LOG.d(TAG, "CordovaActivity.onDestroy()");

super.onDestroy();

if (this.appView != null) {

appView.handleDestroy();

}

}

@Override

public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) {

cordovaInterface.setActivityResultRequestCode(requestCode);

super.startActivityForResult(intent, requestCode, options);

}

/**

* Called when an activity you launched exits, giving you the requestCode you started it with,

* the resultCode it returned, and any additional data from it.

*

* @param requestCode The request code originally supplied to startActivityForResult(),

* allowing you to identify who this result came from.

* @param resultCode The integer result code returned by the child activity through its setResult().

* @param intent An Intent, which can return result data to the caller (various data can be attached to Intent "extras").

*/

@Override

public void onActivityResult(int requestCode, int resultCode, Intent intent) {

LOG.d(TAG, "Incoming Result. Request code = " + requestCode);

super.onActivityResult(requestCode, resultCode, intent);

cordovaInterface.onActivityResult(requestCode, resultCode, intent);

}

@Override

public void onSaveInstanceState(Bundle outState) {

cordovaInterface.onSaveInstanceState(outState);

super.onSaveInstanceState(outState);

}

/**

* Called by the system when the device configuration changes while your activity is running.

*

* @param newConfig The new device configuration

*/

@Override

public void onConfigurationChanged(Configuration newConfig) {

super.onConfigurationChanged(newConfig);

if (this.appView == null) {

return;

}

PluginManager pm = this.appView.getPluginManager();

if (pm != null) {

pm.onConfigurationChanged(newConfig);

}

}

/**

* Called by the system when the user grants permissions

*

* @param requestCode

* @param permissions

* @param grantResults

*/

@Override

public void onRequestPermissionsResult(int requestCode, String permissions[],

int[] grantResults) {

try

{

cordovaInterface.onRequestPermissionResult(requestCode, permissions, grantResults);

}

catch (JSONException e)

{

LOG.d(TAG, "JSONException: Parameters fed into the method are not valid");

e.printStackTrace();

}

}

/**

* Construct the default web view object.

*

* Override this to customize the webview that is used.

*/

protected CordovaWebView makeWebView() {

return new CordovaWebViewImpl(makeWebViewEngine());

}

protected CordovaWebViewEngine makeWebViewEngine() {

return CordovaWebViewImpl.createEngine(getActivity(), preferences);

}

protected CordovaInterfaceImpl makeCordovaInterface() {

return new CordovaInterfaceImpl(getActivity()) {

@Override

public Object onMessage(String id, Object data) {

// Plumb this to CordovaActivity.onMessage for backwards compatibility

return CordovaFragment.this.onMessage(id, data);

}

};

}

/**

* Load the url into the webview.

*/

public void loadUrl(String url) {

if (appView == null) {

init();

}

// If keepRunning

this.keepRunning = preferences.getBoolean("KeepRunning", true);

appView.loadUrlIntoView(url, true);

}

/**

* Called when a message is sent to plugin.

*

* @param id The message id

* @param data The message data

* @return Object or null

*/

public Object onMessage(String id, Object data) {

if ("onReceivedError".equals(id)) {

JSONObject d = (JSONObject) data;

try {

this.onReceivedError(d.getInt("errorCode"), d.getString("description"), d.getString("url"));

} catch (JSONException e) {

e.printStackTrace();

}

} else if ("exit".equals(id)) {

getActivity().finish();

}

return null;

}

/**

* Report an error to the host application. These errors are unrecoverable (i.e. the main resource is unavailable).

* The errorCode parameter corresponds to one of the ERROR_* constants.

*

* @param errorCode The error code corresponding to an ERROR_* value.

* @param description A String describing the error.

* @param failingUrl The url that failed to load.

*/

public void onReceivedError(final int errorCode, final String description, final String failingUrl) {

final CordovaFragment me = this;

// If errorUrl specified, then load it

final String errorUrl = preferences.getString("errorUrl", null);

if ((errorUrl != null) && (!failingUrl.equals(errorUrl)) && (appView != null)) {

// Load URL on UI thread

getActivity().runOnUiThread(new Runnable() {

public void run() {

me.appView.showWebPage(errorUrl, false, true, null);

}

});

}

// If not, then display error dialog

else {

final boolean exit = !(errorCode == WebViewClient.ERROR_HOST_LOOKUP);

getActivity().runOnUiThread(new Runnable() {

public void run() {

if (exit) {

me.appView.getView().setVisibility(View.GONE);

me.displayError("Application Error", description + " (" + failingUrl + ")", "OK", exit);

}

}

});

}

}

/**

* Display an error dialog and optionally exit application.

*/

public void displayError(final String title, final String message, final String button, final boolean exit) {

final CordovaFragment me = this;

getActivity().runOnUiThread(new Runnable() {

public void run() {

try {

AlertDialog.Builder dlg = new AlertDialog.Builder(getActivity());

dlg.setMessage(message);

dlg.setTitle(title);

dlg.setCancelable(false);

dlg.setPositiveButton(button,

new AlertDialog.OnClickListener() {

public void onClick(DialogInterface dialog, int which) {

dialog.dismiss();

if (exit) {

getActivity().finish();

}

}

});

dlg.create();

dlg.show();

} catch (Exception e) {

getActivity().finish();

}

}

});

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值