DevQuizのソースコード(Android編)

DevQuizの分野別クイズAndroid編は、AIDLに関連する問題でした。
Googleが提供しているアプリをAndroid端末にインストールし、そのアプリの中の指定された命令を呼び出して結果を表示する自作アプリを作るというAIDLの基本的な動作を確認する為の問題設定になっており、これを比較的簡単な問題だったように思えます。

とは言っても、この問題をやるまでAIDLを知らなかったんですが・・・

早速問題を読んでみると、Google側から提供されているのはアプリと以下のソースコードの一部だけでした。

package com.google.android.apps.gddquiz;
interface IQuizService {
    String getCode();
}

問題として、このようなソースが提供されているということは、こちらが作成しなければならないアプリにも、この部分は絶対使わなければならないんだな・・・と思いながら早速アプリを作りました。

/res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <TextView android:text="TextView" android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
    <Button android:text="Button" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
</LinearLayout>

/src/SampleAIDLActivity.java(パッケージディレクトリは省略)

package jp.futuresoftware.sample50;

import com.google.android.apps.gddquiz.IQuizService;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class SampleAIDLActivity extends Activity {
	
	private IQuizService quizService;
	
	private TextView textView1;
	private Button button1;

	   private ServiceConnection quizServiceConn = new ServiceConnection()
	   {
			@Override
			public void onServiceConnected(ComponentName name, IBinder service)
			{
				quizService = IQuizService.Stub.asInterface(service);
			}
			
			@Override
			public void onServiceDisconnected(ComponentName name)
			{
				quizService = null;
			}
	   };

	   /** Called when the activity is first created. */
	   @Override
	   public void onCreate(Bundle savedInstanceState) {
		   super.onCreate(savedInstanceState);
		   setContentView(R.layout.main);
    
		   Intent intent = new Intent(IQuizService.class.getName());
		   bindService(intent, quizServiceConn, BIND_AUTO_CREATE);

		   textView1 = (TextView)findViewById(R.id.textView1);
		   button1 = (Button)findViewById(R.id.button1);
        
		   button1.setOnClickListener(new OnClickListener(){
			   @Override
			   public void onClick(View v)
			   {
				   Intent intent = new Intent(IQuizService.class.getName());
				   bindService(intent, quizServiceConn, BIND_AUTO_CREATE);
				   
				   try
				   {
					   textView1.setText(quizService.getCode());
				   }
				   catch(RemoteException exp)
				   {
					   exp.printStackTrace();
					   textView1.setText(exp.getMessage());
				   }
				   catch(Exception exp)
				   {
					   exp.printStackTrace();
					   textView1.setText(exp.getMessage());
				   }
			   }
		   });
	   }

	   @Override
	   protected void onDestroy() {
		   super.onDestroy();
		   unbindService(quizServiceConn);
	   }
}

/src/IQuizService.aidl(パッケージディレクトリは省略)

package com.google.android.apps.gddquiz;

interface IQuizService {
    String getCode();
}

/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="jp.futuresoftware.sample50"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".SampleAIDLActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <service android:name="IQuizService">
            <intent-filter>
                <action android:name="com.google.android.apps.gddquiz.IQuizService"></action>
            </intent-filter>
        </service>

    </application>
</manifest>

普段からAndroidアプリの開発をしていますが、AIDLを知らなかった自分が残念・・・

This entry was posted in プログラム. Bookmark the permalink.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です