2015年2月9日月曜日

[Phonegap/Cordova]意外と知られていないプロセスまで残さずアプリを終了する方法[Android]



Cordova(Phonegap)では意外と知られていないアプリの終了方法について。

アプリ終了メソッドとして"navigator.app.exitapp()"というのがありましたが、必ずアプリが終了できるかというとそうでもないです。
アクティビティは退避されますがプロセスが残ってしまいます。


確実にプロセスまでしっかり終了させるためには、Java側でプロセス終了させる必要があります。

しかしながら、Cordova(Phonegap)はHTML側でのデザインが基本なので、Cordovaプラグインを自作、Javaの処理をHTML側(javascript)から呼び出します。


[追加するもの]

  • javascript --- 終了処理のトリガー(index.htmlのjavascript)、Java呼び出し側プラグイン(ShutdownPlugin.js)
  • Java --- Java呼び出され側プラグイン(ShutdownPlugin.java)

[修正するもの]

  • 独自プラグイン設定ファイル(config.xml)

[ディレクトリ構成]

/assets/www/indes.html
/assets/www/js/plugin/ShutdownPlugin.js
/src/com/example/sample/plugin/ShutdownPlugin.java
/res/xml/config.xml
青色の部分は必要に応じて変更してください
赤色の部分は新しくディレクトリを作成します


↓よってこんな感じです。


必要に応じてjavascript部分を外部ファイルにするのもOKです。

/assets/www/index.html

function onDeviceReady(){
     // 戻るボタンイベント登録
     document.addEventListener("backbutton",showShutdownConfirm,false);
}

// 終了処理
function showShutdownConfirm() {
    try{
        navigator.notification.confirm(
            'アプリケーションを終了しますか?', // メッセージ
            function(buttonIndex){
                if (buttonIndex == 1) ; // キャンセルボタン
                else
                if (buttonIndex == 2) Shutdown.exec(); // 終了ボタン
            }, // 選択されたボタン情報とともに呼ばれるコールバック関数
            '終了', // タイトル
            'キャンセル,終了' // ボタン
        );
    }catch(e){
        // alert("アプリを終了しました!");
    }
}

必要であれば"/assets/www"ディレクトリにjsディレクトリ、pluginディレクトリなどを作り、その中にプラグインファイル(javascript側)を入れます。

/assets/www/js/plugin/ShutdownPlugin.js

var Shutdown = {
 exec: function () {
  return cordova.exec( this.Success, this.Error,"ShutdownPlugin","shutdown", [true]);
 },
 Success: function() {
    // alert("SUCCESS: \r\n" + result );
 },
 Error: function(error) {
     alert("ERROR: \r\nShutdown - " + error );
 }
};


com/example/sample部分はご自身の環境に合わせて適宜変更してください。

/src/com/example/sample/plugin/ShutdownPlugin.java

package com.examle.sample.plugin;

import org.apache.cordova.api.CallbackContext;
import org.apache.cordova.api.CordovaPlugin;
import org.json.JSONArray;
import org.json.JSONException;

public class ShutdownPlugin extends CordovaPlugin {

 public boolean execute(String action, JSONArray data, CallbackContext callbackContext) throws JSONException {
  try {
   if (action.equals("shutdown")){
    android.os.Process.killProcess(android.os.Process.myPid());
   }
  } catch (Exception e) {
//   Log.d("ShutdownPlugin", e.toString());
  }
  callbackContext.success();
  return true;
 }
}


config.xmlに関しては、ファイルの末端にある<plugins>タグ内に以下のように今回作ったプラグインファイルのパスを指定してあげます。
com.example.sampleの部分はご自身の環境に合わせて適宜変更してください。

/res/xml/config.xml


        



結果的にJava側でkillProcessメソッドを呼び出す形になります。

これでアプリのプロセスを残さず終了することができます。

是非お試しあれ!


にほんブログ村 スマホ・携帯ブログへにほんブログ村 IT技術ブログ Androidアプリ開発へにほんブログ村 IT技術ブログへ

0 件のコメント:

コメントを投稿