Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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

hal_sk
Georepublic Japan CEO http://georepublic.co.jp/, Code for Japan 代表理事 http://code4japan.org/, Detailed profile: http://jp.linkedin.com/in/halsk/ お仕事の依頼は info@georepublic.co.jp までお願いします。
http://www.georepublic.co.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away