Xperiaを買ったのでタスク管理アプリに挑戦してみた。

Eclipseを設定して、developer.android.com見ながら地味ぃ〜にコードを書いてみました。
コードはプロセス一覧の取得を試みた内容となります。(未完成)
取得したpackageNameをrestartPackageの引数に入れるとアプリは終了します。
ちなみに自分自身の終了はfinish()を実行でよい。

AndroidManifest.xml にpermission設定

<uses-permission android:name="android.permission.GET_TASKS" /> 
<uses-permission android:name="android.permission.RESTART_PACKAGES" /> 

procListActivity.java

package jp.o2mana;

import java.util.ArrayList;
import java.util.List;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ListAdapter;

import android.app.ActivityManager;
import android.app.ActivityManager.RecentTaskInfo;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
//import android.content.pm.ApplicationInfo;

public class procListActivity extends ListActivity {
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        List<IconTextArrayItem> items = new ArrayList<IconTextArrayItem>();

        ActivityManager am = (ActivityManager)this.getSystemService(ACTIVITY_SERVICE);
        List<RecentTaskInfo> taskinfos = am.getRecentTasks(99,1);
        PackageManager pm = getPackageManager();

        try{
          for(int i = 0; i < taskinfos.size(); i++){
            RecentTaskInfo task = taskinfos.get(i);
            
            Intent intent = task.baseIntent;
            ActivityInfo actvInfo =  intent.resolveActivityInfo(pm, 0);
            //ApplicationInfo appInfo = actvInfo.applicationInfo;
            //String PackageName = actvInfo.PackageName;
            //am.restartPackage(PackageName);
            items.add(new IconTextArrayItem(actvInfo.loadIcon(pm) ,  actvInfo.loadLabel(pm).toString()));
          }
        }catch(Exception e){
            //Log.i("Error",e.getMessage(),e);
        }

        ListAdapter adapter = new IconTextArrayAdapter(this, R.layout.list_row, items);
        setListAdapter(adapter);
        
        Button button = (Button) findViewById(R.id.exec_button);
        button.setOnClickListener(new View.OnClickListener() {
          
          public void onClick(View v) {
            execButton();
          }

          private void execButton() {
            
            
          }});
    }
}


xFuturesさんのアイコン付きのリストを作ってみるを参考にリスト表示してます。
本来はiconのResource IDを受け取って画像を表示となっていますが、Drawableを受け取るように一部修正して使わせていただきました。

まだ実装には色々問題がありまして、終了するとまずいアプリが表示します。
他には、何かのキャッシュのせいか、他のタスク管理アプリで終了したアプリが表示します。
あと、一部のアプリが表示出来ないので、RecentTaskInfoでの取得だと、まずいのでしょうね。ActivityManager周りは色々試したんですがねぇ。。
psコマンドの内訳を解析するしかないのだろうか?

ゴールデンウィーク中に仕上げようと頑張ってみたのですが、中々難しいものですね。
今回のアプリは、アプリ一覧の取得周りの不具合が解消しそうにないので、一旦保留とします。

Androidでコードを書くのは楽しかったので、また何か思いついたら作ってみます。