Developers‎ > ‎マニュアル‎ > ‎

Eventプラグインアプリの作成

3. Eventプラグインアプリの作成


Eventプラグインアプリでは、状態の変化をBLOCCOに通知し、ユーザが設定した条件を満たしているかどうかの判定をする役割を担っています。例をあげると、Androidの向きが「縦から横にかわったとき」や「Androidに着信があったとき」などの発火するための条件を設定する際に用いるプラグインアプリになっています。


Eventプラグインアプリの構成要素としては以下となります

  • インストール処理を行うためのInstaller 

EventプラグインアプリをBLOCCOへ組み込む(プラグインアプリとして認識させる)

  • 条件を設定するActivity 

アプリ利用者が発火するための条件を設定する

  • 状態の変化を監視/判定するServiceReceiver

指定した状態の変化を常時監視し、変化があった場合にBLOCCO本体に変化を通知する。その後BLOCCOから受ける設定条件にマッチしているかどうかのService問い合わせに対し条件判定を行う

Eventプラグインアプリでは、3つの状態のアプリを1つのパッケージに保持する構成になります。

アプリケーション ActivityService BroadcastReceiver
 インストール ×
× ◯ 
 条件設定◯ × × 
 条件監視/判定× ◯ ◯ 

Eventプラグインアプリが、状態を監視し自身のReceiverに変化を通知する場合のBroadcast名は、パッケージ名.LOCALCAST”というアクション名を使用するようにしてください。パッケージ名が”com.blocco.event.001”ならば、アクション名は”com.blocco.event.001.LOCALCAST”という形で定義してください。

Installer(BroadcastReceiver)

Installerでは、BLOCCOプラグインであるEventプラグインアプリがインストールされた際に、BLOCCO本体で、Androidが発行するBroadcastのインストール通知を受け取り、BLOCCO本体とEventプラグインアプリが連携して、Eventプラグインアプリのインストール処理をおこないます。インストール処理により、EventプラグインアプリはBLOCCO本体と連携が可能な状態になります。



インストールが成功すると、下図のようにAndroidNotoficationBLOCCOでのインストールに成功した通知が表示されます。 


Eventプラグインアプリが、BLOCCO本体にインストール処理で組み込まれる事で、BLOCCOのイベントアプリ一覧に表示され、 Intent起動で設定画面が実行されるようになります。


条件設定用Activity


条件設定用Activityでは、Eventプラグインアプリが発火するための監視条件を設定するために用います。条件設定用ActivityBLOCCO本体から、結果付きのActivity起動(startActivityForResult)により起動され、条件を設定し、その設定値をXML形式に変換し、BLOCCO本体に渡します。BLOCCOでは、各設定毎に設定用XMLを保持し、Eventプラグインアプリに変化があった際の条件判定の値として使用します。

BLOCCO本体に保存されるXMLの例

Eventプラグインアプリのプログラム内で、下記のように指定すると

bloccoEvent.setCommand("type", "1”);

<event></event>に囲われたXMLが生成されます。<type>がキー名、1の部分が値になっています。setCommand(“キー名”, ““)に対応します。

<event>

  <type>1</type>

</event>

条件監視用ServiceBoradcastReceiver

Eventプラグインアプリが発火するまでのプロセスは、 状態変化を通知するBroadcastEventプラグインアプリがReceiverで受信し、BLOCCO本体に向けて状態の変化をBroadcastで通知します。BLOCCO本体は、それに基づき、ユーザが設定した設定値をEventプラグインアプリとのService接続の際に受け渡し、それに基づきBLOCCO本体からonBindされるEventプラグインアプリのServiceonCall()で、そのユーザが設定した値が条件を満たしているかを確認し、True or Falseの返り値を返します。

Androidシステムから通知されるBroadcastは、時間の変化などが存在しています。AndroidシステムからBroadcastされている値を監視する場合は、AndroidシステムからBroadcastReceiverで受信する事で、状態に変化があった事を察知します。

以下にAndroidシステムから通知される状態変化に関するBroadcastのアクション例を示します。


 Broadcastのアクション名 通知のタイミング
 Intent.ACTION_BATTERY_CHANGEDバッテリーの値が変化した際に通知。 
 Intent.ACTION_BOOT_COMPLETEDAndroidシステムが起動した後に通知。 
 Intent.ACTION_DATE_CHANGED 日付が変わった際に通知。
 Intent.ACTION_DEVICE_STORAGE_LOW デバイスのストレージが少なくなった際に通知。
 Intent.ACTION_PACKAGE_ADDEDAndroidシステムにパッケージが追加された際に通知。 
 Intent.ACTION_POWER_CONNECTED電源ケーブルが接続された際に通知。 
 Intent.ACTION_POWER_DISCONNECTED電源ケーブルが接続された際に通知。 
 Intent.ACTION_SCREEN_ONスクリーンがONになった際に通知。 
 Intent.ACTION_SCREEN_OFFスクリーンがOFFになった際に通知。 
Intent.ACTION_TIME_CHANGED 時間が設定された際に通知。 
Intent.ACTION_TIME_TICK  時間が変化した際に通知。1分毎に通知される。
Intent.ACTION_WALLPAPER_CHANGED 壁紙が変更された際に通知。

また、同様に自分で作成したServiceからBroadcastを飛ばし、EventプラグインアプリでそのBroadcastReceiverで受信し、状態の変化を察知する事も可能になっています。例えば、万歩計などは、AndroidシステムではBroadcastされないので、自分で実装した状態変化監視用ServiceからBroadcastする仕組みを実装します。

3.1 Eventプラグインアプリのインストーラーの作成

EventプラグインアプリをBLOCCO本体にインストールするためのインストーラーに関して解説します。EventプラグインアプリのBLOCCO本体へのインストール処理は、下図のの流れで行われます。


 アクション名 発行者

受信者 明示的 or 暗示的 概要
 ① android.intent.action.PACKAGE_ADDEDAndroidシステム BLOCCO暗示的  インストールされたEventアプリのパッケージ名等が含まれたIntentが取得できる。
 ② com.blocco.event.INSTALL
BLOCCO Eventプラグインアプリ 暗示的 ①で取得したIntentでパッケージ名を指定してEventアプリにBroadcastする。
 ③com.blocco.main.EVENT_INSTALLEventプラグインアプリ  BLOCCO明示的  Eventアプリの情報を含んだIntentをBroadcastする。

EventプラグインアプリをBLOCCO本体にインストールするために、AndroidManifest.xmlにアクション名"com.blocco.event.INSTALL"が受信できるように、<receiver ></receiver>の記述を追記し、Blocco本体からのBroadcastを受信可能な状態にし、EventプラグインアプリからBLOCCO本体にEventプラグインアプリの情報を含んだBroadcastをおこなう事で、インストール処理をおこないます。

Eventプラグインアプリでは、Blocco.jarに含まれているBloccoEventManagerを用いて開発していきます。 インストーラーに必要な要素は、設定UI画面用Activity名、状態監視用Serice名、Eventプラグインの説明文、Eventプラグインアプリの出力形式等を設定します。


 メソッド名概要 
 BloccoEventManager.setActivity(String activity)設定UI画面用Activity名 
 BloccoEventManager.setService(String service)状態監視用Service名 
BloccoEventManager.setIntro(String intro) Eventプラグインの説明文 
BloccoEventManager.setOutputFormatType(int formatType) Eventプラグインアプリの出力形式 
BloccoEventManager.setDevid(String developerId) プラグインアプリ製作者の開発ID 
BloccoEventManager.setShareUiXml(String shareUiXml) 初期設定UI画面用XML 

BloccoEventManager.setOutputFormatType()で設定可能なOutput形式は下記の通りです。

各形式の詳細はjavadoc参照


EventPluginOutputFormat


サンプル;画面のON/OFF EVENT

DisplayCheckerInstaller.java



3行目では、インストール時に使うライブラリをImportします。
import com.blocco.plugin.BloccoEventManager;

22行目では、Event向けのライブラリであるBloccoEventManagerのインスタンスを生成します。
BloccoEventManager bloccoEvent = new BloccoEventManager(context);

25行目では、Eventプラグインアプリの設定UI画面のActivityを指定します。
bloccoEvent.setActivity("DisplayCheckerActivity");

28行目では、Eventプラグインアプリの状態を監視及び条件判定を行うServiceを指定します。
bloccoEvent.setService("DisplayCheckerService");

31行目では、Eventアプリの結果の出力形式を指定します。
bloccoEvent.setOutputFormatType(BloccoEventManager.FORMAT_TYPE_NONE);

34行目では、Eventアプリの解説文を指定します。
bloccoEvent.setIntro("端末画面のON/OFFを監視します");

37行目では、プラグイン開発者のIDを指定します。
bloccoEvent.setDevid("******");

40行目では、初期設定用のUIXMLを指定します。
bloccoOutput.setShareUiXml(createShareUiXml());

43行目のinstall()を呼ぶことで、Blocco本体にBroadcastされ、インストール処理が開始されます。
bloccoEvent().install();


AndroidMainifest.xml

<receiver android:name=".DisplayCheckerInstaller">
    <intent-filter>
        <action android:name="com.blocco.event.INSTALL">
        <category android:name="android.intent.category.DEFAULT">
    </intent-filter>
</receiver>

AndroidManifest.xmlでは、<receiver></receiver>の記述を追加し、BLOCCO本体から発行されるアクション名"com.blocco.event.INSTALL"Broadcastを受信できるように設定します。

インストール処理が成功すると、BLOCCOよりAndroidNotificationに下図のようなメッセージが表示されます。




3.2 Eventプラグインアプリの条件設定用Activityの作成

条件設定用Activity では、Eventプラグインアプリが実行判定するための監視条件の値を、ユーザが設定するために用います。





条件設定用Activityは、BLOCCO本体でミニアプリを策定する際に、一覧で表示され、ユーザが選択したEventプラグインがIntent呼び出しにより起動します。 設定UI表示用Activityでは、それぞれのミニアプリに応じたEventプラグインアプリの条件を設定可能で、設定した値は、XMLの形式に変換されて、BLOCCO本体に保存されます。

条件設定用ActivityBLOCCO連携部分は、Blocco.jarに含まれるBloccoEventManagerクラスにより設定します。

Eventプラグインアプリでは、画面下にBLOCCOメニューを表示する必要があります。メニューの表示は、BloccoEventManager.buildUi()でおこない、組み込まれると画面下にSave, Cancelボタンが表示されます。


Save, Cancelが押されたイベントを取得するためには、 BloccoEventManagerListenerをImplementsします。これにより、onSave()メソッド、onCancel()メソッドを実装し、saveボタンとcancelボタンが押された際のイベントを取得できるようになります。
Eventプラグインアプリで設定した値は、BloccoEventManager.setCommand(“キー名”,”値”)で設定し、BloccoEventManager.save()で、BLOCCO本体に送付され、Eventプラグインアプリを終了します。


例えば、

BloccoEventManager.setCommand("type","1");
BloccoEventManager.save();

という記述をした倍は、下記のようなXMLの値がBLOCCO本体に返されます。

<event>
    <type>1</type>
</event>


<event>~</event>タグはEventプラグインアプリで設定された事を意味し、<type>1</type>が、setCommand(“キー名”,”値”)で設定した<キー名>値</キー名>を意味します。




  • サンプル;画面のON/OFF EVENT 


DisplayCheckerActivity.java



3行~5行目で、BloccoEditManager, BloccoEventManager, BloccoEventManagerListenerImportします。

import com.blocco.plugin.BloccoEditManager;
import com.blocco.plugin.BloccoEventManager;
import com.blocco.plugin.BloccoEventManagerListener;

18行目で、BloccoEventManagerListenerをImplementsします。これにより、onSave(), onCancel()のメソッドを追加します。

public class DisplayChecker extends Activity implements BloccoEventManagerListener {

34行目で、タイトルバーを非表示にします。

requestWindowFeature( Window.FEATURE_NO_TITLE ); 

40行目で、BloccoEventManagerのインスタンスを生成します。
bloccoEvent = new BloccoEventManager(this);

43行目で、デフォルトの値を設定します。
bloccoEvent.setCommand("type","0");

57行目~62行目でラジオボタンを押されたときの処理をおこないます。
if(checkedId == R.id.display_on){
    eventType = 0;
}
else if(checkedId == R.id.display_off){
    eventType = 1;
}

68行目で、画面の上に重ねて描画するメニューUIを追加します。
bloccoEvent.buildUi(this, this);

71行目で、画面の下に表示されるSaveおよびCancelボタンのイベントリスナーを追加します。
bloccoEvent.setEventManagerListener(this);

77行目で、詳細画面からの遷移かどうかの判定をおこないます。
if(intent.getStringExtra("EDIT") != null){

80行目で、BloccoEditManagerのインスタンスを生成します。
BloccoEditManager bloccoEdit = new BloccoEditManager();

83行目で、マネージャーにActivity起動時に受信したIntentをセットします。
bloccoEdit.setEdit(intent);

86行目で、後述するsetCommandにて設定した値を取得します。
String type = bloccoEdit.getCommand("type");

89行目~95行目で、UI等に設定値を反映する処理をおこないます。
if(type.equals("1")){
    radioGroup.check(R.id.display_off);
    eventType = 1;
}else{
    radioGroup.check(R.id.display_on);
    eventType = 0;
}

104行目~107行目で、キャンセル処理をおこないます。
public void onCancel() {
    //値を保存せず、Eventプラグインアプリを終了します
    bloccoEvent.cancel(this);
}

113行目~119行目で、保存処理をおこないます。設定された値は、setCommandでBLOCCO本体に保存されます。
public void onSave() {
    //キー名、値を指定して値を設定します
    bloccoEvent.setCommand("type",""+eventType);
    //値を保存して、Eventプラグインを終了します
bloccoEvent.save(this);

main.xml
  1. <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:paddingtop="80px" android:paddingbottom="130px" android:background="#FFFFFF">  
  2.       
  3.     <textview android:text="画面のON/OFFのイベント" android:id="@+id/TextView01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textcolor="#000000">  
  4.     </textview>  
  5.         <linearlayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0" android:layout_gravity="center">  
  6.         <radiogroup android:id="@+id/radiogroup" android:layout_width="wrap_content" android:layout_height="wrap_content">  
  7.             <radiobutton android:id="@+id/display_on" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="画面がONになったとき" android:textcolor="#000000">  
  8.             <radiobutton android:id="@+id/display_off" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="画面がOFFになったとき" android:textcolor="#000000">  
  9.         </radiobutton></radiobutton></radiogroup>  
  10.     </linearlayout>  
  11. </linearlayout>  
main.xmlで画面のUIを作成しますが、Activityの68行目で
bloccoEvent.buildUi(this, this);
とする事で、下130ピクセルにBloccoのUI(Save, Cancelボタン)が重ねて表示されるようになります。



AndroidManifest.xml

<activity android:name=".DisplayCheckerActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="com.blocco.event.SETTING" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

アクション名"com.blocco.event.SETTING"で、BLOCCO本体からIntentで起動できるように設定します。

3.3 EventプラグインアプリのReceiverServiceの作成

Eventプラグインアプリの状態を監視する部分は、ReceiverServiceの組み合わせ監視をおこなっています。EventプラグインアプリがBLOCCO本体からService問い合わせを受けるまでの流れは、 Eventプラグインアプリに含まれるReceiverが状態の変化を受信し、① BLOCCO本体にBroadcastし、② BLOCCO本体からEventプラグインアプリのServiceonBindし、onCall()で条件判定をします。
具体的な例を使って説明してみます。

電池が減った場合、Androidシステムがアクション名:Intent.ACTION_BATTERY_CHANGEDで BroadcastされまEventプラグインアプリに含まれるReceiverアプリBroadcastされたIntentを受信します。Eventプラグインアプリが変化を察知した後は、の処理によりBLOCCO本体にアクション名;com.blocco.main.EVENTCASTを発行し、変化があった事を通知します。BLOCCO本体は、アクション名; com.blocco.main.EVENTCASTを受信し、の処理でEventプラグインアプリに含まれるServiceに、 条件設定用Activityでユーザが設定したXMLの値をServiceに渡し、ServiceonBindします。

サンプルアプリでは、EventReceiverEventServiceという2つのアプリで状態を監視しています。EventReceiverがイベントの変化のBroadcastを察知しBLOCCO本体にBroadcastし、EventServiceでは、BLOCCOからの問い合わせに関して、条件がマッチしているかどうかの正否を返しています

EventReceiverでは、BloccoEventManagersendEventCastメソッドを呼び出す事で、監視する値の変化を察知した事をBLOCCO本体に通達しています。

サンプル : 画面のON/OFF EVENT

DisplayCheckerReceiver.java


3行目で、BloccoEventManagerをImportします。
import com.blocco.plugin.BloccoEventManager;

12行目で、BroadcastReceiverを継承します。これによりAndroidシステムの発行するBroadcastおよび自身の発行するBroadcastを受信可能になります。
public class DisplayCheckerReceiver extends  BroadcastReceiver{

16行目〜34行目で、受信したBroadcastに含まれるIntentの展開をおこないます。

24行目で、BloccoEventManagerのインスタンスを生成します。
BloccoEventManager bloccoEvent = new BloccoEventManager(context);

27行目で、Blocco本体にBroadcastします。
bloccoEvent.sendEventcast();

30行目~33行目は、受信したBroadcastに含まれるIntentの値を、Service側で条件判定などで必要とする場合は、Intentを経由してServiceに渡しています。こちらの処理は、BLOCCOとの連携には関係のないアプリ固有な処理となっています。

状態判定をおこなうServiceでもBLOCCOからのServiceの問い合わせが可能なようにAndroidManifest.xmlを修正します。

AndroidManifest.xml

<service android:enabled="true" android:name=".EventService" android:exported="true">
    <intent-filter>
        <action android:name="com.blocco.event.SERVICE_START"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
    <intent-filter>
        <action android:name="com.blocco.event.SERVICE_CHECK" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    <intent-filter>
        <action android:name="com.blocco.LOCALSEND" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</service>

Androidアプリでは、Service問い合わせがあった場合に、onBind()が呼び出されます。BLOCCOと条件判定用のServiceを連携させるための処理は、onBind()内でおこないます。条件判定用のServiceを生成する際に、BloccoEventListenerImplementsし、onBind()の中で、
BloccoEventManager.setEventListener(this)を記述し、onBind()の返り値に、
bloccoEvent.serviceEvent();を返す事で、BLOCCO本体と連携され、BLOCCOから条件判定用のService onCallメソッドを呼び出す事が可能になります。 条件を満たしているかどうかは、onCallメソッドの中で、 BloccoEventManager.result(Boolean)を呼び出す事で、BLOCCO本体に条件を満たしているかどうかを通知します。

サンプル:画面のON/OFF EVENT

DisplayCheckerServer.java


4行目、5行目で、Eventアプリで使用するライブラリをimportします。
import com.blocco.plugin.BloccoEventListener;
import com.blocco.plugin.BloccoEventManager;

20行目で、BloccoEventListenerImplementsします。これで、Blocco本体からonCallを呼び出せるようになります。
public class DisplayCheckerService extends Service implements BloccoEventListener {

48行目~52行目では、ReceiverをFilterに登録します。このようにサービス内でレシーバーの登録を行うことで、このEventアプリが監視をしている間のみシステムからのBroadcastを受け取るように設計しています。

104行目~147行目で、Blocco本体から呼び出された際の条件判定を記述します。

104行目のonCallでは、uidにプラン毎のユニークID、 commandには設定用Activityで設定した値、myselfには、自分が通知もとの場合はtrueが送付されてきます。
public void onCall(String uid, String command, boolean myself) {

結果は、bloccoEvent.result(true); なら条件一致、bloccoEvent.result(false);なら条件不一致になります。
ċ
DisplayCheckerActivity.java
(4k)
Hayato Ito,
2011/03/27 23:33
ċ
DisplayCheckerInstaller.java
(3k)
Hayato Ito,
2011/03/27 12:16
ċ
DisplayCheckerReceiver.java
(1k)
Hayato Ito,
2011/03/29 20:27
ċ
DisplayCheckerService.java
(5k)
Hayato Ito,
2011/03/29 22:47
Comments