【転】AndroidにおけるTASKとPROCESSの違いは、最近実行されているプログラムと実行中のプロセスを取得することです.

4052 ワード

回転:http://blog.csdn.net/yao_gutet/article/detail/6267943
私の個人的な理解:
まずあなたが見ているのはプロセスではなく、タスクです.
端末を使って、psに負けて、本当の運行の中のlinux processを見ることができて、私のmicrestoneの上で普通は90があります.
複数
Androidでは、apとprocessとtaskは三つの全く異なる概念です.
processはLinuxから継承された概念です.一般的に一つのアプリにはuidがあります.必要に応じて独立してpを開きます.
rocess.一部のprocessはappの容器として使われています.他のprocessは下の階のlinuxで使われています.また、
珍しいですが、一つのプロcessやuidを複数のアプリで共有することもあります.
taskはactivityのスタックで、その中に「可能」は複数のAppからのactivityを含んでいます.つまり、複数のpから来ています.
ロックス、taskを殺すのは普通Taskの根を閉じるactivityの引き出す子樹で、必ずしもkillを連れて対応のを落としますとは限りません.
process
ですから、この三つのものは混ざり合います.windowsや他のosの中でそんなにはっきりしたプロセス境界がありません.
APIでは、実行中のものを獲得するには、ActivityManagerのような種類があります.
get RecentTask()最近オープンしたtaskです.HOMEボタンを長押しするとこれが見えます.
getRunningAppProcess()の実行中のap容器としてのprocessです.
getRunningServices()実行中のバックグラウンドサービス
getRunningTask()実行中のジョブ
だからAPIの中でも、これらのものは統一されていません.
もし一つのactivity Aがtaskとしてのroot activityではなく他のtaskに呼び出されたら、Aが対応するp
ロックは開いていますが、この時に表示されますか?
また、もし一つのアプリがserviceだけ開いていて、Activityやtaskがないなら、開いていますか?
異なるキラーを加えると、システムのキープロセスやキーサービスに対するフィルタリングの仕方が違ってくるかもしれません.
ある程度の混乱が増える.
結局、Androidには他のosの中の明確な任務概念がありません.これらの概念はすべてそのプログラム自体です.
自分で定義したので、混乱しています.
最近実行しているプログラムのリストを取得します.

public void getTaskList() {  
    ImageButton ivIcon;  
    ActivityManager am = (ActivityManager)getSystemService(ACTIVITY_SERVICE);  
    PackageManager pm = this.getPackageManager();  
    try {  
        List<RecentTaskInfo> list = am.getRecentTasks(64, 0);  
        llTaskBar.removeAllViews();  
        for (RecentTaskInfo ti : list) {  
            Intent intent = ti.baseIntent;  
            ResolveInfo resolveInfo = pm.resolveActivity(intent, 0);  
            if (resolveInfo != null) {  
                ivIcon = new ImageButton(this);  
                ivIcon.setImageDrawable(resolveInfo.loadIcon(pm));  
                ivIcon.setFocusable(true);  
                ivIcon.setClickable(true);  
                ivIcon.setEnabled(true);  
                      
                ivIcon.setScaleType(ScaleType.CENTER);  
                      
                ivIcon.setLayoutParams(new LinearLayout.LayoutParams(120, 120));  
                llTaskBar.addView(ivIcon);  
            }  
        }  
    } catch (SecurityException se) {  
        se.printStackTrace();  
    }  
}  
実行中のプロセスリストを取得:

public void getRunningProcessList() {  
    ImageButton ivIcon;  
    ActivityManager am = (ActivityManager)getSystemService(ACTIVITY_SERVICE);  
    List<ActivityManager.RunningAppProcessInfo> list = am.getRunningAppProcesses();  
    PackageManager pm = this.getApplicationContext().getPackageManager();  
    llTaskBar.removeAllViews();  
    for (ActivityManager.RunningAppProcessInfo pi : list) {  
        if (pm.getLaunchIntentForPackage(pi.processName) != null) {  
            try {  
                ApplicationInfo ai = pm.getApplicationInfo(pi.processName,   
                        PackageManager.GET_META_DATA);  
                if (ai != null) {  
                    ivIcon = new ImageButton(this);  
                    ivIcon.setImageDrawable(ai.loadIcon(pm));  
                    ivIcon.setFocusable(true);  
                    ivIcon.setClickable(true);  
                    ivIcon.setEnabled(true);  
                      
                    ivIcon.setScaleType(ScaleType.CENTER);  
                      
                    ivIcon.setLayoutParams(new LinearLayout.LayoutParams(120, 120));  
                    llTaskBar.addView(ivIcon);  
                }  
            } catch (NameNotFoundException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
}