Android項目實戰--手機衛士20--拿到已經安裝了的程序以及程序管理主界面



最新實戰教程,讓你瞭解Android自動化刷量、作弊與防作弊的那些事,案例:刷友盟統計、批量註冊蘋果帳號




好了,之前我們就講了高級工具裏面的短信備份與還原,那麼我們高級工具裏面的功能就基本上完成的啦,還有一個叫程序鎖的功能而已,但我們今天先不做它先,我們先把我們的程序管理這個功能完成先。

先讓大家看一下我們程序管理要做成什麼樣子先

         

我們程序管理這個功能主要就是上面的第二張圖片啦,主要就是有卸載、運行和分享而已

我們今天就先把第一張圖片裏面的內容完成先,

要完成第一張截圖裏面的內容,我們首先就要知道,程序管理,那麼就是要把我們手機裏面的所有應用讀取出來,然後才能操作的,所以我們就要新建一個model類用來存放這些應用的信息啦,然後還有有一個類用來讀取手機裏面所有的應用的

com.xiaobin.security.domain.AppInfo

package com.xiaobin.security.domain;

import android.graphics.drawable.Drawable;

public class AppInfo
{
	private Drawable icon;
	private String appName;
	private String packageName;
	private boolean isSystemApp;
	
	public Drawable getIcon()
	{
		return icon;
	}
	public void setIcon(Drawable icon)
	{
		this.icon = icon;
	}
	public String getAppName()
	{
		return appName;
	}
	public void setAppName(String appName)
	{
		this.appName = appName;
	}
	public String getPackageName()
	{
		return packageName;
	}
	public void setPackageName(String packageName)
	{
		this.packageName = packageName;
	}
	public boolean isSystemApp()
	{
		return isSystemApp;
	}
	public void setSystemApp(boolean isSystemApp)
	{
		this.isSystemApp = isSystemApp;
	}

}

Model類寫好之後,我們就要寫一個類來讀取手機裏面的應用啦

com.xiaobin.security.engine.AppInfoProvider

package com.xiaobin.security.engine;

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

import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;

import com.xiaobin.security.domain.AppInfo;

public class AppInfoProvider
{
	private PackageManager packageManager;
	
	public AppInfoProvider(Context context)
	{
		//拿到一個包管理器
		packageManager = context.getPackageManager();
	}

	public List<AppInfo> getAllApps()
	{
		List<AppInfo> list = new ArrayList<AppInfo>();
		AppInfo myAppInfo;
		//獲取到所有安裝了的應用程序的信息,包括那些卸載了的,但沒有清除數據的應用程序
		List<PackageInfo> packageInfos = packageManager.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);
		for(PackageInfo info : packageInfos)
		{
			myAppInfo = new AppInfo();
			//拿到包名
			String packageName = info.packageName;
			//拿到應用程序的信息
			ApplicationInfo appInfo = info.applicationInfo;
			//拿到應用程序的圖標
			Drawable icon = appInfo.loadIcon(packageManager);
			//拿到應用程序的程序名
			String appName = appInfo.loadLabel(packageManager).toString();
			myAppInfo.setAppName(appName);
			myAppInfo.setPackageName(packageName);
			myAppInfo.setIcon(icon);
			if(filterApp(appInfo))
			{
				myAppInfo.setSystemApp(false);
			}
			else
			{
				myAppInfo.setSystemApp(true);
			}
			list.add(myAppInfo);
		}
		return list;
	}
	
	//判斷某一個應用程序是不是系統的應用程序,如果是返回true,否則返回false
	public boolean filterApp(ApplicationInfo info)
	{
		//有些系統應用是可以更新的,如果用戶自己下載了一個系統的應用來更新了原來的,
		//它還是系統應用,這個就是判斷這種情況的
		if((info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0)
		{
			return true;
		}
		else if((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0)//判斷是不是系統應用
		{
			return true;
		}
		return false;
	}

}

大家也可以看到啦,主要就是通過PackageManager來拿到ApplicationInfo然後得到應用的包名這些信息的

最後大家可以看到,我們寫了一個函數來判定是不是系統自帶的應用,因爲我們明天要做那些卸載邏輯的時候就要用到了,如果是系統的應用,那麼我們是不可以卸載的


好啦,現在所以的應用都被我們拿到啦,那麼,我們現在要做的就是展現到界面上啦,那麼我們就來處理一下UI

我們是用一個ListView來存放這些應用的信息的

所以就有兩個佈局文件啦

app_manager_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="65dip"
    android:gravity="center_vertical"
    android:background="@drawable/item_background_selector"
    android:orientation="horizontal" >
    
    <ImageView 
        android:id="@+id/iv_app_manager_icon"
        android:layout_width="60dip"
        android:layout_height="60dip"
        android:scaleType="fitXY"
        android:src="@drawable/app"
        android:contentDescription="@string/hello_world"/>
    
    <TextView 
        android:id="@+id/tv_app_manager_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dip"
        android:textSize="21sp"
        android:textColor="#ff000000"/>

</LinearLayout>

app_manager.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="40dip"
        android:gravity="center_vertical|center_horizontal"
        android:background="@drawable/title_background"
        android:orientation="vertical">
        
        <TextView 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@android:color/white"
            android:textSize="22sp"
            android:text="@string/app_manager"/>
        
    </LinearLayout>
    
    <FrameLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/white">
        
	    <ListView 
	        android:id="@+id/lv_app_manager"
	        android:layout_width="match_parent"
	        android:layout_height="match_parent"
	        android:background="@android:color/white"
	        android:cacheColorHint="@android:color/white"
	        android:layout_marginTop="10dip" />
	    
	    <LinearLayout 
	        android:id="@+id/ll_app_manager_progress"
	        android:layout_width="match_parent"
	        android:layout_height="match_parent"
	        android:gravity="center_vertical|center_horizontal"
	        android:orientation="vertical"
	        android:visibility="gone">
	        
	        <ProgressBar 
	            android:layout_width="wrap_content"
	            android:layout_height="wrap_content"/>
	        
	        <TextView 
	            android:layout_width="wrap_content"
	            android:layout_height="wrap_content"
	            android:text="@string/app_manager_load"
	            android:textSize="18sp"
	            android:textColor="#ffbc04e5"/>
	        
	    </LinearLayout>
        
    </FrameLayout>

</LinearLayout>


因爲讀取手機裏面的應用是一個非常耗時的操作來的,特別是用戶手機裏面的應用特別多的時候,所以我們就在上面加了一個進度條,讓用戶知道現在是讀取着應用的

所以如果一進去,就是像下面這個樣子的了



那麼,現在我們就來寫一下Activity裏面的邏輯啦

com.xiaobin.security.ui.AppManagerActivity

package com.xiaobin.security.ui;

import java.util.List;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

import com.xiaobin.security.R;
import com.xiaobin.security.domain.AppInfo;
import com.xiaobin.security.engine.AppInfoProvider;

public class AppManagerActivity extends Activity
{
	private static final int GET_ALL_APP_FINISH = 1;
	
	private ListView lv_app_manager;
	private LinearLayout ll_app_manager_progress;
	private AppInfoProvider provider;
	private AppManagerAdapter adapter;
	private List<AppInfo> list;
	
	@SuppressLint("HandlerLeak")
	private Handler handler = new Handler()
	{
		public void handleMessage(Message msg) 
		{
			switch(msg.what)
			{
				case GET_ALL_APP_FINISH : 
					//進度條設置爲不可見
					ll_app_manager_progress.setVisibility(View.GONE);
					adapter = new AppManagerAdapter();
					lv_app_manager.setAdapter(adapter);
					break;
					
				default : 
					break;
			}
		};
	};
	
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.app_manager);
		
		lv_app_manager = (ListView) findViewById(R.id.lv_app_manager);
		ll_app_manager_progress = (LinearLayout) findViewById(R.id.ll_app_manager_progress);
		ll_app_manager_progress.setVisibility(View.VISIBLE);
		
		//因爲搜索手機裏面的應用程序有可能是非常耗時的,所以我們開啓一個新的線程去進行搜索
		//當搜索完成之後,就把一個成功的消息發送給Handler,然後handler把搜索到的數據設置進入listview裏面
		new Thread()
		{
			public void run() 
			{
				provider = new AppInfoProvider(AppManagerActivity.this);
				list = provider.getAllApps();
				
				Message msg = new Message();
				msg.what = GET_ALL_APP_FINISH;
				handler.sendMessage(msg);
			};
		}.start();
	}
	
	//======================================================================
	
	private class AppManagerAdapter extends BaseAdapter
	{

		@Override
		public int getCount()
		{
			return list.size();
		}

		@Override
		public Object getItem(int position)
		{
			return list.get(position);
		}

		@Override
		public long getItemId(int position)
		{
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent)
		{
			AppInfo info = list.get(position);
			if(convertView == null)
			{
				View view = View.inflate(AppManagerActivity.this, R.layout.app_manager_item, null);
				AppManagerViews views = new AppManagerViews();
				views.iv_app_icon = (ImageView) view.findViewById(R.id.iv_app_manager_icon);
				views.tv_app_name = (TextView) view.findViewById(R.id.tv_app_manager_name);
				views.iv_app_icon.setImageDrawable(info.getIcon());
				views.tv_app_name.setText(info.getAppName());
				view.setTag(views);
				return view;
			}
			else
			{
				AppManagerViews views = (AppManagerViews) convertView.getTag();
				views.iv_app_icon.setImageDrawable(info.getIcon());
				views.tv_app_name.setText(info.getAppName());
				return convertView;
			}
		}
		
	}
	
	//用來優化listview的類
	private class AppManagerViews
	{
		ImageView iv_app_icon;
		TextView tv_app_name;
	}

}

上面的代碼也很簡單啦,我們之前都寫過不少啦,應用可以看明白的了,所以我就不寫註釋了

到這裏爲止,我們今天要講的就完成的啦

現在我們就可以測試一下,看一下我們的程序管理能不能把手機裏面的應用讀取出來的啦,至於那些卸載這些的邏輯,我們明天再完成它

好啦,今天就到這裏,謝謝支持!


今天源碼下載




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章