導航:首頁 > 操作系統 > android獲取task

android獲取task

發布時間:2022-08-11 19:31:34

❶ 如何獲取android 進程信息

1.獲取系統的可用內存和總內存。

獲取系統內存中應用的信息,需要用到ActivityManager這個類,然而當你用這個類拿數據的時候你會發現,拿到的數據不正確。用這個類的API獲取系統的總內存和可用內存會出現數據不正確的情況。除了這個類,Android手機中有文件描述了這些信息——/proc/meminfo。meminfo文件中詳細的記錄了安卓手機的一些數據,包括可用內存和總內存。附上代碼:
public static long getTotalMemSize() {
long size=0;
File file = new File("/proc/meminfo");
try {
BufferedReader buffer = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
String memInfo = buffer.readLine();
int startIndex = memInfo.indexOf(":");
int endIndex = memInfo.indexOf("k");
memInfo = memInfo.substring(startIndex + 1, endIndex).trim();
size = Long.parseLong(memInfo);
size *= 1024;
buffer.close();
} catch (java.io.IOException e) {
e.printStackTrace();
}
return size;
}

public static long getAviableMemSize() {
long size=0;
File file = new File("/proc/meminfo");
try {
BufferedReader buffer = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
String memInfos=new String();
int i=0;
while ((memInfos=buffer.readLine())!=null){
i++;
if (i==2){
memInfo = memInfos;
}

}
int startIndex = memInfo.indexOf(":");
int endIndex = memInfo.indexOf("k");
memInfo = memInfo.substring(startIndex + 1, endIndex).trim();
size = Long.parseLong(memInfo);
size *= 1024;
buffer.close();
} catch (java.io.IOException e) {
e.printStackTrace();
}

return size;
}

操作很簡單分別是讀取第一行的數據和第二行的數據,將字元串分去出,將所得值乘以1024變為byte類型。

2.獲取內存中運行應用的信息

首先,自然要有一個Bean文件用於存儲這些信息,之後通過ActivityManager的getRunningAppProcesses()方法得到一個RunningAppProcessInfo的List。便利這個List去除我們想要的數據,存在我們的Bean文件夾中。
public static List<TaskBean> getAllTask() {
List<TaskBean>taskList=new ArrayList<>();
List<ActivityManager.RunningAppProcessInfo>runList=UIUtils.getActManager().getRunningAppProcesses();
try {
for (ActivityManager.RunningAppProcessInfo r:runList) {
TaskBean taskBean = new TaskBean();
String processName = r.processName;
taskBean.setPackageName(processName);
PackageInfo packageInfo = UIUtils.getPacManager().getPackageInfo(processName, 0);
taskBean.setIcon(packageInfo.applicationInfo.loadIcon(UIUtils.getPacManager()));
taskBean.setName(packageInfo.applicationInfo.loadLabel(UIUtils.getPacManager()).toString());
Debug.MemoryInfo[] processInfo=UIUtils.getActManager().getProcessMemoryInfo(new int[]{r.pid});
taskBean.setMemSize(processInfo[0].getTotalPrivateDirty()*1024);
if ((packageInfo.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM)!=0){
taskBean.setSystem(true);
}else {
taskBean.setUser(true);
}
if (taskList != null) {
taskList.add(taskBean);
for (int i=0;i<taskList.size();i++) {
if (taskList.get(i).getPackageName().equals(Constants.PACKAGE_INFO)){
taskList.remove(i);
}
}
}
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}

return taskList;
}

好了,大功告成。當你開開心心的拿到手機上調試的時候你會發現,一個數據都沒有。原來,在Android5.0之後,谷歌處於完全考慮已經棄用了通過如上方法拿到進程中的信息。那麼又應該怎麼做呢?
public static List<TaskBean> getTaskInfos() {
List<AndroidAppProcess> processInfos = ProcessManager.getRunningAppProcesses();

List<TaskBean> taskinfos = new ArrayList<TaskBean>();
// 遍歷運行的程序,並且獲取其中的信息
for (AndroidAppProcess processInfo : processInfos) {
TaskBean taskinfo = new TaskBean();
// 應用程序的包名
String packname = processInfo.name;
taskinfo.setPackageName(packname);
// 湖區應用程序的內存 信息
android.os.Debug.MemoryInfo[] memoryInfos = UIUtils.getActManager()
.getProcessMemoryInfo(new int[] { processInfo.pid });
long memsize = memoryInfos[0].getTotalPrivateDirty() * 1024L;
taskinfo.setMemSize(memsize);
taskinfo.setPackageName(processInfo.getPackageName());
try {
// 獲取應用程序信息
ApplicationInfo applicationInfo = UIUtils.getPacManager().getApplicationInfo(
packname, 0);
Drawable icon = applicationInfo.loadIcon(UIUtils.getPacManager());
taskinfo.setIcon(icon);
String name = applicationInfo.loadLabel(UIUtils.getPacManager()).toString();
taskinfo.setName(name);

if ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
// 用戶進程
taskinfo.setUser(true);
} else {
// 系統進程
taskinfo.setSystem(true);
}
} catch (PackageManager.NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
// 系統內核進程 沒有名稱
taskinfo.setName(packname);
Drawable icon = UIUtils.getContext().getResources().getDrawable(
R.drawable.ic_launcher);
taskinfo.setIcon(icon);
}
if (taskinfo != null) {
taskinfos.add(taskinfo);
for (int i=0;i<taskinfos.size();i++) {
if (taskinfos.get(i).getPackageName().equals(Constants.PACKAGE_INFO)){
taskinfos.remove(i);
}
}
}
}
return taskinfos;
}

好了,接下來只需要判斷安裝的版本就可以了:
int sysVersion = Integer.parseInt(Build.VERSION.SDK);
taskList = sysVersion > 21 ? TaskManagerEngine.getTaskInfos() : TaskManagerEngine.getAllTask();

好了,大功告成。數據就能正常拿到了。

❷ 新手請教,android中的task是個什麼東東

task就是一連串的操作組成的一個任務鏈.比如:從MMS里添加附件進入Camera,再按Camera菜單進入Gallery,再從Gallery設置圖片為聯系人進入Contacts.......雖然起了很多個Activity,但是通常情況下他們都屬於同一個task.每個Activity可以在Manifest中配置自己是否另起一個task,默認是不另起的.

❸ android task 在哪

安卓手機比起一些老的智能機是比較浪費流量的. 在關閉所有軟體的流量情況下. 安卓自身每天都會產生100KB左右的流量. 流量浪費在於使用者會不會使用. 我的手機每天最多,1M不到

❹ Android中怎麼切換task到前台

如果你的平台是面向Android3.0(API level
11),那麼恭喜你,一個函數就可以搞定:
moveTaskToFront

http://developer.android.com/reference/android/app/ActivityManager.html#moveTaskToFront(int,
int)

如果你和我一樣苦逼的在用2.2的平台,那麼就要稍微麻煩點了,基本上是用taskAffinity +

FLAG_ACTIVITY_NEW_TASK +

FLAG_ACTIVITY_SINGLE_TOP。

先來看一下sdk怎麼說的:
1.

taskAffinity:

SDK說,如果用帶FLAG_ACTIVITY_NEW_TASK標志來啟動一個activity,並且這個activity與當前運行的另一個task(A)的affinity名字相同,那麼就這個activity就會在那個task(A)里啟動。

Ok,到這還不行,人家沒說會把Task_A帶到前台,接著看另一個Flag

2.

FLAG_ACTIVITY_NEW_TASK

好了,重點來了:如果Task_A中已經有了Activity_2,這時候如果以FLAG_ACTIVITY_NEW_TASK來start
Activity_2,那麼這個Task_A就會被帶到前台。

好了,現在Task_A已經可以到前台了,剩下最後一步:Activity_2不能創建兩次,這就要求同時使用下面這個flag:

3.

FLAG_ACTIVITY_SINGLE_TOP

如果Activity_2在Task的頂端,那麼這個Activity_2就不會被再此創建,而是走onNewIntent.

至此,結合上面3個特性,問題得以解決。結合代碼,流程如下:

1. 在androdiManifest.xml中添加Activity_2的taskAffinity
name與Task_A相同(也就是與Activity_1的taskAffinity名字相同),如android:taskAffinity
= "android.task.calendar"。

2.
在Task_B啟動前,Activity_1先啟動Activity_2並要求返回結果,startActivityForResult().

3.
Task_B中的Activity_4取得所需數據後,保存好(intent,或其他方法),然後startActivity(Activity_2),並帶上(FLAG_ACTIVITY_NEW_TASK
| FLAG_ACTIVITY_SINGLE_TOP)標志。

4. Task_A被帶到前台,並且調用到Activity_2::onNewIntent().

5.
Activity_2取得之前保存的信息(從Intent或其他地方),調用setResult(),然後finish().

6. Activity_1中的onActivityResult()響應,得到返回結果。

❺ 關於Android獲取線程執行完後的結果的問題!

其實谷歌早就意識到這個問題。Message里有一個send的方法。如下
Message msg = mhandler.obtainMessage(MSG_UPDATE, imgIndex, 0);
mhandler.sendMessage(msg);

然後重寫handler的 handlerMessage方法,如下:
private Handler mhandler = new Handler(){
@Override
public void handleMessage(Message msg){
if(msg.what == MSG_UPDATE){
//你要的操作...

}
}
};

基本上就是這樣啦!

❻ android不同的app是不同的task嗎

getRecentTasks() 最近開的task,HOME鍵長按會看到這個
getRunningAppProcesses() 運行中的作為app容器的process
getRunningServices() 運行中的後台服務
getRunningTasks() 運行中的任務
如果一個Activity 「mainActivity」不是作為task的root activity打開的,而是被別的Task中Activity調用,那麼mainActivity對應的process是開著的,這時我們是否要顯示它呢?
另外,如果一個app只有service開著而在Task中不存在這個app的Activity,算不算開著呢?
所以要根據我們的項目需求進行不同的處理,現在貼出兩個常用的方法:

1.獲取正在運行的進程列表:

[java] view plain
/**
* 獲取正在運行的程序信息
* @param context
* @return
*/
public static List<Programe> getRunningProcess(Context context){
PackagesInfo pi = PackagesInfo.getInstance(context);

ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> run = am.getRunningAppProcesses();
PackageManager pm =context.getPackageManager();
List<Programe> list = new ArrayList<Programe>();
Programe pr = new Programe();
try {
for(RunningAppProcessInfo ra : run){
if(ra.processName.equals("system") || ra.processName.equals("com.Android.phone")){ //可以根據需要屏蔽掉一些進程
continue;
}
pr = new Programe();
pr.setIcon(pi.getInfo(ra.processName).loadIcon(pm));
pr.setName(pi.getInfo(ra.processName).loadLabel(pm).toString());
Log.v("tag","icon = " + pr.getIcon() +"name=" + pr.getName());
list.add(pr);
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}

❼ 如何獲取AsyncTask 非同步處理的返回值

android AsyncTask<String,void,String>
第一個參數就是你要訪問的地址 第二個就是進度 第三個就是返回值
AsyncTask執行完doInBackground會自己調用一下方法
@Override
protected void onPostExecute(string orderBeans) {
super.onPostExecute(orderBeans);
在這個方法中 orderBeans就是返回的值 可以在這個方法中賦值個控制項

❽ android AsyncTask 怎麼返回值給UI線程

可以看下以下幾點即可:
1.把AsyncTask單獨寫成類,不是其他Activity的子類。(這個顯然可以,記住,雖然AsyncTask不是某個Activity的子類,它依然只能在主線程中創建,其四大方法中的三個依然運行在主線程中,詳情見後面。)2.UI線程 通過AsyncTask和伺服器交互,需要根據結果 打開不同的新的activity,可以onPostExecute() 中返回值給主線程嗎?(這個問句就是錯的,onPostExecute()就是在主線程中執行的,不需要返回值給主線程,只需要在此方法中將結果存儲在某個變數中,就可以在主線程中獲取此值。例如,在AsyncTask中增加一個getResult方法)3.另外一個問題, 可以傳參數給AsyncTask,然後在onPostExecute 使用其他activity的 finish() 嗎?(Yes of course。這句問話依然來自你對onPostExecute 的誤解,再說一次,它就在主線程中執行。而Activity的finish方法在主線程中調用顯然沒問題。)簡單說AsyncTask,正好把上一個回答的部分結果拷貝過來給參考:
AsyncTask是一個輔助類,就是為了將Handler、Thread等封裝為一個非同步執行框架,供Android Coder可以方便的使用。其主要目的是為了「在其他線程中執行一個耗時操作,並隨時報告執行進度給UI線程,執行完成後將結果報告給UI線程」。
AsyncTask的使用方法其實Android developer中已經說得非常清楚了,因此擇重點翻譯一次:
AsyncTask使用時必須作為基類被擴展,子類至少重載一個方法doInBackground,另一個方法onPostExecute也經常被重載,代碼例子如下:
6private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}

protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}

protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}

AsyncTask含有三個泛型參數: Params, 非同步任務執行所需的參數類型; Progress, 非同步任務執行進度的類型; Result, 非同步任務執行結果的類型。 這三個參數不必全部使用,不使用的參數置為Void即可,例如:
private class MyTask extends AsyncTask<Void, Void, Void> { ... }

AsyncTask的四個重要方法。當一個非同步任務被執行時,要經歷四步: onPreExecute(),在UI線程中執行,它會在非同步任務開始前執行,一般用來設置任務參數; doInBackground, 最重要的方法,在子線程中執行(事實上,只有它在子線程中執行,其他方法都在UI線程中執行)。當onPreExecute結束後,本方法立刻執行,它用來進行後台的耗時計算,非同步任務的參數會被傳給它,執行完成的結果會被送給第四步;執行途中,它還可以調用publishProgress 方法來通知UI線程當前執行的進度; onProgressUpdate, 當publishProgress 被調用後,它在UI線程中執行,刷新任務進度,一般用來刷新進度條等UI部件; onPostExecute, 當後台的非同步任務完成後,會在UI線程中被調用,並獲取非同步任務執行完成的結果。

❾ Android 深入探討sigleTask和singletop的區別

1.singleTask和singletop都是保真了Activity在棧中的唯一性

2.singleTask和singleTop實例存在時,都不會重新創建 new task

不同之處有如下幾點:

如果singleTask啟動的ActivityA位於棧底,在棧頂startActivity到這個ActivityA時會調動
onNewIntent->onStart->onResume。

但singleTask啟動的的ActivityA不存在時,會重新創建ActivityA,調用方式OnCreate->OnStart->OnResume

2.如果singletop啟動的ActivityB在棧底時,在棧頂startActivity到這個ActivityB時會重新調動
onCreate->onStart->onResume,但不會調用OnDestroy

並且singletop啟動的的ActivityB不存在時,會重新創建ActivityB,調用方式OnCreate->OnStart->OnResume

3.singleTask在棧底時,從棧頂startActivity到棧底ActivityA,那麼該棧startActivity的發起者的中間部分Activity會被銷毀。而singletop是逐級跳躍到棧頂

singleTask

追加一點singleInstance,雖然也是保證唯一性,但改模式的Activity是全局性的唯一性,生命周期和應用程序相同,不能及時回收,此外的話Activity在MVC充當Controller的角色,

這點顯然對singleIntance來說不適合,因此不建議使用。

4.singleTask不適合充當ChildActivity,但singletop適合

5.對作業棧,默認情況下,沒有任何影響,因為棧的taskid是相同的,可以獲取getTaskid(),默認情況下每個activity的taskid相同

但是,如果自定義了棧的標簽(這個標簽相同的singletask activity在同一個作業棧中),那麼taskid就會初選差別

android:taskAffinity="com.sample.lanchmode.tester.main",那麼一旦另一個作業棧被銷毀,下次必然重建(相信我,這不是廢話)。

為了一句不是廢話,我需要來證明一下。

當我們的初始載入WelcomeActivity界面--->HomeActivity界面時,如果將HomeActivity的啟動模式設置為sigleTask+android:taskAffinity="自定義(一般是類名)",

①那麼WelcomeActivity銷毀後,在到達HomeActivity之後,HomeActivity回作為一個新的作業棧棧底而存在,所以由HomeActivity啟動的Activity的TaskId和HomeActivity相同。

②這個過程,WelcomeActivity和HomeActivity的TaskId是不相同的,問題出現了,當我們按下 Home鍵,然後在點擊桌面上的app圖標你會發現,WelcomeActivity再次出現了,

而且再次進入了HomeActivity,並且這個HomeActivity調用了OnNewIntent,卻沒掉用OnCreate,所以來說他一直存在這,但你需要再次過渡才能找到它。

(對於追求捕獲Home鍵讓app退出的讀者是一個喜訊,這樣可以做到每次Home之後都能再次進入登錄界面),在這個過程中沒有直接進入HomeActivity,而是WelcomeActivity(有人說不對么,不應該是這樣么,在這里不想解釋)。

注意,使用了不同作業棧的Activity,會在最近打開的app顯示一個應用會出現2個界面。

在這里,需要強調一下singleTask+android:taskAffinity不一定必須使用,請依據需求而定,網上有人推薦使用,但我卻想說,不要盲目,並不是所有的應用都適合。

1-->
singleTask+android:taskAffinity對於效率而言,優勢並不存在,比如設置進程的,但對於帶有登錄狀態的app需要慎用,否則造成信息泄露等問題,開發中只使用singleTask即可。

2-->
singleTask+android:taskAffinity適用於單用戶保密性的app(可做到Home之後下次必須登錄才能查看信息),建議在這方面試試。

轉載

閱讀全文

與android獲取task相關的資料

熱點內容
網盤的小說在哪個文件夾 瀏覽:59
阿里程序員約炮 瀏覽:939
java語言程序設計題 瀏覽:464
法和經濟學pdf 瀏覽:703
statafgls命令 瀏覽:737
汽車壓縮機電磁閥檢測 瀏覽:543
c編譯器如何打開 瀏覽:760
小受重生回80年代 瀏覽:797
夢幻無敵伺服器什麼時候開的 瀏覽:903
cnc編程程序走不了g代碼不正確 瀏覽:772
轉轉app賣家怎麼收錢 瀏覽:883
app綁定微信支付讓拒是怎麼回事 瀏覽:568
radan編程 瀏覽:52
高清pdf電子書 瀏覽:339
騰訊的伺服器用什麼處理器 瀏覽:405
安卓開發如何配置 瀏覽:848
門戶網站整站源碼 瀏覽:613
如何使用伺服器gpu 瀏覽:874
男主到全是女人的世界 瀏覽:345
泰國女同電影 瀏覽:95