[Android] アプリを一旦停止して、再び起動した時にWebViewの最後に訪れたURLをロードする

ハマったのでメモ。 結論から言うとonResume メソッドをActivityにオーバーライドすればいい。

ちなみに下のコードのlastURL、activeWebViewはインスタンス変数で最後に訪れたurlと現在のwebViewを参照している。

Code

@Override
    protected void onResume() {
        super.onResume();
       
        if (lastURL != "")
            activeWebView.loadUrl(lastURL);
    }

DjangoのAdmin画面から日本語の文字を入力するとCaught UnicodeEncodeError while rendering: ‘ascii’ のエラーが出る件について

Djangoははモデルの属性値としてUnicode文字列を返すので、モデルに__unicode__() メソッドを実装すればこのようなエラーは解決できる。

class YourModel(models.Model):

    def __unicode__(self):
        return u"{}".format(self.your_field)

公式サイトを見たら一発で解決だった。

AndroidのWebView内のJSからAndroid側のメソッドを呼び出してみる

WebViewのJavaScriptからAndroid側のメソッドを呼び出すにはWebAppInterfaceを継承したクラスを作ってそのクラスをwebViewにaddJavascriptInterface(…)を実装すればいいのですが、その最小限のコード例と簡単な解説を記しておきます。

MainActivity.java

...
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new MyWebAppInterface(this), "Android");
...

MainActiviy.javaの

webView.addJavascriptInterface(new MyWebAppInterface(this), "Android");
によってJavaScript側からAndroidのメソッドを呼ぶときは
Android.hogehoge()
の形式で呼ぶことができるようになります。

それでは次にMyWebAppInterface.javaを実装します。

MyWebAppInterface.java

public class MyWebAppInterface{
    Context mContext;

    /** Instantiate the interface and set the context */
    MyWebAppInterface(Context c) {
        mContext = c;
    }


    @JavascriptInterface
    public String hello() {
        return "Hello from Android!";

    }

}

@JavascriptInterfaceが付いているhelloというメソッドは JavaScript側からアクセスできるメソッドとなります。

これでJavaScriptから
Android.deviceToken();
のメソッドを呼び出すと、
>> "Hello from Android"
という文字列が返ってきます。

Djangoのキャッシュをクリアする

以下のコマンドでDjangoのキャッシュをクリアできる。

$ python python manage.py shell
>> from django.core.cache import cache
>> cache.clear()

新規データが追加されたタイミングでキャッシュをクリアするようにしたりとか色々と使い道がある。

AmazonSNSを使ってPythonからAndroidデバイスにPUSH通知を送信する最小限のコード

Android側の処理はこちらのサイトに詳しく説明されているのでこちらを見てください。

最小限のコード

import boto
import re
import os
import boto.sns

class PushManager(object):
    help = 'setup'


    def publish(self):
        AWS_ACCESS_KEY = settings.LOCAL_AWS_ACCESS_KEY
        AWS_SECRET_KEY = settings.LOCAL_AWS_SECRET_KEY

        arn = 'your_arn'

        sns_connection = boto.sns.connect_to_region('ap-northeast-1',
                                                    aws_access_key_id=AWS_ACCESS_KEY,
                                                    aws_secret_access_key=AWS_SECRET_KEY)

        android_token= 'Androidアプリ側のRegisteration_IDを記載'

        res = sns_connection.create_platform_endpoint(
            platform_application_arn=arn,
            token= android_token,
        custom_user_data = 'test')

        endpoint = res.get('CreatePlatformEndpointResponse').get('CreatePlatformEndpointResult').get('EndpointArn')

        sns_connection.publish(target_arn=endpoint, message=u"Hello World")

使い方

p = PushManager()
p.publish()

感想

iOSアプリと違って証明書周りは簡単だけど、逆にアプリ側の実装が面倒だ。。。