LoginSignup
5
5

More than 5 years have passed since last update.

PhoneGap の Plugin で呼び出した結果に応じて、呼び出し元の WebView で実行されている Sench Touch Application を操作する

Posted at

PhoneGap plugin を使うと、Sencha Touch アプリケーションからネイティブコードを実行できる。新しいActivityを呼び出さない形のPlugin であれば、return new PluginResult(戻り値); の結果として Sencha Touch 側に実行結果が帰ってくるが、新しいActivity を呼び出してしまうと、元のWebViewへのアクセスが難しい。

新しく起動したActivityの結果から元のSencha Touch Applicationを操作したい場合、Sencha Touch Application が実行されている Activity (DroidGapクラスを拡張したもの)のインスタンスを取得し、super.loadUrl() を使って routes 呼び出しをしてあげると良い

android.app.Application クラスを拡張したクラスを作る

Application.java
package jp.myapp;

public class Application extends android.app.Application {

    private MainActivity mainActivity;

    public void setMainActivity(MainActivity mainActivity) {
        this.mainActivity = mainActivity;
    }

    public MainActivity getMainActivity() {
        return mainActivity;
    }

}

カスタム Application クラスを利用できるようにする( android:name=".Application" に注目)

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="jp.myapp"
      android:versionCode="1"
      android:versionName="1.0">
-snip-
    <application android:name=".Application" android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".MainActivity"
                  android:label="@string/app_name"
                  android:screenOrientation="portrait"
                  android:configChanges="orientation|keyboardHidden">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
-snip-
    </application>
</manifest>

メインActivity(Sencha Touch Application が起動)。
起動時に、Application クラスに自分のインスタンスを格納する

MainActivity.java
package jp.myapp;

import org.apache.cordova.DroidGap;

import android.content.Intent;
import android.os.Bundle;

public class MainActivity extends DroidGap {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // set my activithy to Application context
        Application app = (Application)getApplication();
        app.setMainActivity(this);
        // show webview
        Intent i = getIntent();
        super.loadUrl("file:///android_asset/www/index.html");
    }

    public void goTop() {
        super.loadUrl("file:///android_asset/www/index.html#home/index");
    }

    public void goList() {
        super.loadUrl("file:///android_asset/www/index.html#picture/list");
    }
}

Sencha Touch から呼び出される PhoneGap Plugin

AwesomePlugin
package jp.myapp.plugin;

import jp.myapp.AwesomeActivity

import org.apache.cordova.api.Plugin;
import org.apache.cordova.api.PluginResult;
import org.json.JSONArray;

import android.content.Intent;
import android.util.Log;

public class AwesomePlugin extends Plugin {
    private static final String TAG = AwesomePlugin.class.getSimpleName();

    @Override
    public PluginResult execute(String action, JSONArray data, String callbackId) {
        Log.d(TAG, "AwesomePlugin invoked");
        Intent intent = new Intent(this.ctx.getContext(),AwesomeActivity.class);
        // 新しいActivityを呼び出す
        this.ctx.startActivityForResult(intent);

        return new PluginResult(org.apache.cordova.api.PluginResult.Status.OK);
    }

    // AwesomeActivity:setResult(int resultCode);を実行した場合に呼ばれる
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        Log.d(TAG, "onActivityResult:" + resultCode);
        super.onActivityResult(requestCode, resultCode, intent);
        // Application クラスからMainActivityを呼び出し、resultCode に応じた処理を実行する
        Application app = (Application)this.ctx.getApplicationContext();
        if (resultCode == 0){
            // back
            // do nothing
        }else if(resultCode == 1){
            // topへ戻るボタンが押された
            app.getMainActivity().goTop();
        }else if(resultCode == 2){
            // listへ戻るボタンが押された
            app.getMainActivity().goList();
        }
    }
}

最後に、Sencha Touch 側の controller。#home/index や #picture/list の routes を用意しておく。

controller/Main.coffee
Ext.define 'MyApp.controller.Main',
    extend: 'Ext.app.Controller'
    config:
      routes:
        'home/index' : 'goTop'
        'picture/list' : 'pictureList'
    ###
      goto Top
    ###
    goTop: () ->
      console.log 'goTop'
      # go to toppage

    ###
      show picture list
    ###
    pictureList: () ->
      console.log 'goList'
      # do your cool things

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5