パケ代節約
このページ、docomo ユーザー限定かも…
僕は Android 購入以前、携帯電話をあまり活用していませんでした。
フリープログラマーなのでほぼ家にいるし(お仕事待ってます)、外出時に「これから帰る」とメールする程度。
月額780円。基本料のみですね。
docomoではメールは無料だし、家族間の通話も基本無料です。
時折 i-mode で「行きたい店の予約」を入れたりするけど、これも月額の無料範囲内。
スマホなんて買ってしまうと、簡単に月額5千円近く行ってしまうので買わないぞ、と誓っていました。
でも、携帯が壊れた。買いなおそうと思ったら、すでに i-mode に選択できるような機種がなかった。
…と言うわけで強制的にスマホに移行。
パケット節約生活
さて、ここからが本題。
いままでの月額780円生活を維持するにはどうすればよいのでしょう?
前提条件として、「月額780円」とはいっても、本体代金の割賦である、月額2100円は発生しています。
そして、この割賦額は全部「2段階定額」プランの最低料金として組み入れられています。
(いわゆる、「実質0円販売」ですね)
というわけで、わずかなパケットは発生しても構いません。月 5M Byte までね。
そして、SPモードメールはこのカウントに含まれません。
簡単に言えば、すべての通信をオフにすればよいのです。
それでも、「SPモードメールが届いた」という通知だけはきます。
この通知に気づいたら、手動でモバイルデータ通信をオンにして、メールを取得して、モバイルデータ通信をオフにすればよい。
このとき、間違っても自動同期がオンになっていないように注意すること。
…面倒くさいです。
しかも、SPモードメールが届いた、と言う通知は、音も振動も出してくれないのです。
通知領域
Llama は、通知領域に特定のアプリが通知を出した、という状況を認識します。
通知領域の読み取りは、「ユーザー補助」の一環です。
だから、Llama にユーザー補助の権限を与えなくてはなりません。
Android の設定から、ユーザー補助に入り、Llama にチェックを入れてください。(他にユーザー補助アプリがない場合は、まず「ユーザー補助」にチェックを入れること。ユーザー補助機能を使うことにしないと、Llamaにチェックできない)
これで、通知領域にSPモードメールが「メールが届いています」と通知を出したことを認識できます。これは、データ通信ではなくて「電話の制御信号」で伝えられますから。
あとは、音と振動で知らせるだけ。
そうしたら、僕は手動でモバイルデータ通信をオンにして、メールを取得して、モバイルデータ通信をオフにするわけです。
面倒くさいけど、まずは第一歩の完成。
通信開始
そもそも、i-mode ではどうなっていたんでしょう?
i-mode は、常時通信はしていませんでした。
i-mode 通信が開始されるのは、メールの送受信が行われるときだけ。そして、送受信後しばらくたつと、通信は終了しました。
すでに旧携帯は使えないので記憶のみで書きますが、i-modeメールの到着通知がきた場合、すぐに「メール問い合わせ中」状態になります。
一方で、i-mode 通信を開始します。問い合わせ中に i-mode 通信のネットワークに接続が完了すると、そこからメールのダウンロードが行われます。
電波状態が悪いなどの理由で通信に失敗していると、問い合わせは 30秒程度続きます。
SPモードメールの動作を見ると、やはり到着通知がきた場合、「メール問い合わせ」を開始します。
モバイルデータもWiFi も接続していない場合、30秒ほどでタイムアウトします。
どうも、メーラーの側としては同じ仕組みで動いているようです。
あとは、着信時の「通信開始」さえ作れれば…
というわけで、Llama でこの仕組みを再現します。
仕組みは簡単、先ほど「着信したら音を鳴らす」としましたが、代わりにモバイルデータ通信をオンにするだけです。
このとき、念のために自動同期もオフにしておきます。
通信終了
メール問い合わせは、1分もかからず完了するでしょう。
だから、1分後には通信終了することにします。
着信して、モバイルデータオンのときに、「遅延イベント」を作ります。
遅延イベントは、その瞬間に「1回限り」のイベントを作成する方法です。実行されるとこのイベントは消えます。
(イベントタブを見ていると、作成されて、消えるのがわかります)
これで大丈夫…といいたいところですが、実はこの方法はうまく動きません。
1分以内に2通のメールが来ると、2回連続でイベントを作ろうとします。
ところが、同じ名前のイベントを作ろうとすることになるので、エラーとなるのです。
そこで、着信時に、Llama 変数をセットすることにします。
そして、この変数セットを条件として起動するイベントを作ります。
このイベントに、「遅延実行」の属性をつけます。
こちらは、遅延イベントとは違って、あらかじめ作成してあるイベントを、時間を置いて実行するだけ。
連続して2回実行されてもエラーにはなりません。
メール送信
メール送信のことも考えなくてはなりません。
理想を言えば送信した瞬間に通信をオンにしたいのですが、これは難しいので「SPモードメールが起動されたら」にします。
メールを送る前には、必ず起動されますから。
こちらは、SPモードメールが終了したり、画面がオフになったら1分後にデータ通信を終了します。
先に作った仕組みがあるので、変数をセットするだけです。
(終了ですぐオフにしないのは、送信ボタンを押したらすぐアプリを終了したり、画面をオフしてしまうかもしれないためです。)
画面がオフになったらデータ通信を終了するので、逆に画面がオンになったとき、SPモードメールが現在アプリであれば、データ通信をオンにするようにもしておきます。
WiFi との兼ね合い
いろいろと書いていますが、以上は「WiFi が使えないとき」の話です。
WiFi 接続中であれば、SPモードメールは WiFi 通信でメールを取得するでしょう。
…が、「メールがきました」通知は通知領域に出すので、このままではモバイルデータをオンにしてしまいます。
WiFi 接続時は、この動作を抑制するようにしておきましょう。
他の動作についても同様です。モバイルデータをオンにしなかったのであれば、オフも不要です。
そのため、オンにしたときには、変数に「モバイルデータをオンにしている」ことを保持しておきます。