好了,之前我们就讲了高级工具里面的短信备份与还原,那么我们高级工具里面的功能就基本上完成的啦,还有一个叫程序锁的功能而已,但我们今天先不做它先,我们先把我们的程序管理这个功能完成先。

先让大家看一下我们程序管理要做成什么样子先

         

我们程序管理这个功能主要就是上面的第二张图片啦,主要就是有卸载、运行和分享而已

我们今天就先把第一张图片里面的内容完成先,

要完成第一张截图里面的内容,我们首先就要知道,程序管理,那么就是要把我们手机里面的所有应用读取出来,然后才能操作的,所以我们就要新建一个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;
} }

上面的代码也很简单啦,我们之前都写过不少啦,应用可以看明白的了,所以我就不写注释了

到这里为止,我们今天要讲的就完成的啦

现在我们就可以测试一下,看一下我们的程序管理能不能把手机里面的应用读取出来的啦,至于那些卸载这些的逻辑,我们明天再完成它

好啦,今天就到这里,谢谢支持!

今天源码下载

Android项目实战--手机卫士20--拿到已经安装了的程序以及程序管理主界面的更多相关文章

  1. Android项目实战--手机卫士开发系列教程

    <ignore_js_op> banner131010.jpg (71.4 KB, 下载次数: 0) 下载附件  保存到相册 2 分钟前 上传   Android项目实战--手机卫士01- ...

  2. Android 项目实战--手机卫士(实现splash)

    从今天开始根据之前学习的android的基础知识,实战一下,实现一个简单功能的android手机卫士 本文地址:http://www.cnblogs.com/wuyudong/p/5899283.ht ...

  3. Android项目实战--手机卫士18--读取用户的短信内容以及短信备份

    我们今天要说的就是我们手机卫士里面的高级工具里面的短信备份功能啦,其实这个软件备份的功能也很简单,就是把用户的短信读出来,然后写到一个xml或者数据库里面, 但我们这里的是读取到xml里面的. 首先我 ...

  4. Android项目实战--手机卫士24--程序锁的实现以及逻辑

    昨天我们已经把程序全部读取出来,显示到界面上了,那今天,我们就来讲一下那个程序锁的实现啦.其实也很简单啦,我们主要就是把用户要锁定的程序放到一个表里面,然后就监听手机里面的任务栈,如果发现任务栈里面出 ...

  5. Android项目实战手机安全卫士(02)

    目录 项目结构图 源代码 运行结果 项目源代码 项目结构图 源代码 清单 01.  SplashActivity.java package com.coderdream.mobilesafe.acti ...

  6. Android项目实战手机安全卫士(01)

    目录 项目结构图 源代码 运行结果 项目结构图 源代码 SplashActivity.java package com.coderdream.mobilesafe.activity; import a ...

  7. (转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例

    Android项目实战(二十八):使用Zxing实现二维码及优化实例 作者:听着music睡 字体:[增加 减小] 类型:转载 时间:2016-11-21我要评论 这篇文章主要介绍了Android项目 ...

  8. Android项目实战(二十九):酒店预定日期选择

    先看需求效果图: 几个需求点: 1.显示当月以及下个月的日历 (可自行拓展更多月份) 2.首次点击选择"开始日期",再次点击选择"结束日期" (1).如果&qu ...

  9. Android项目实战(四十九):Andoird 7.0+相机适配

    解决方案类似: Android项目实战(四十):Andoird 7.0+ 安装APK适配 解决方法: 一.在AndroidManifest.xml 文件中添加 四大组件之一的 <provider ...

随机推荐

  1. HTML5 表单与文件

    -新增元素与属性 form.formaction.formmethod.placeholder(处于未输入状态时文本框显示的输入提示).autofocus(自动获取光标焦点).list(该属性的值为某 ...

  2. jQuery 源码基本框架

    抽丝剥茧, 7000+ 行的 jQuery 源码基本可以概括为以下的伪代码 (function (window, undefined) { //将 document 封装成 jQuery 对象并缓存 ...

  3. Winform使用DevExpress的WaitDialogForm画面

    使用了DevExpress的WaitDialogForm 在应用程序加载开始时新建一个线程,并将loading画面show起来,在应用程序画面弹出前将该线程终止. 代码: private DevExp ...

  4. php基础知识【函数】(9)数学和对象类函数

    一.数学  abs -- 绝对值 ceil -- 进一法取整 floor -- 舍去法取整 fmod -- 返回除法的浮点数余数 round -- 对浮点数进行四舍五入 sqrt -- 平方根 pi( ...

  5. Android获取相册图片

    1. AlertDialog的使用 2. 显示和隐式意图的区别 3. 相册页面的跳转 4. 选择完成后返回图片的获取 ----------------------------------------- ...

  6. Android各种访问权限Permission详解

    原文:http://jingyan.baidu.com/article/afd8f4de4688af34e386e976.html 在Android的设计中,资源的访问或者网络连接,要得到这些服务都需 ...

  7. python模块之re正则表达式

    41.python的正则表达式      1. python中re模块提供了正则表达式相关操作 字符: . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字      \W大写代表非\w ...

  8. C# 程序性能提升篇-2、类型(字段类型、class和struct)的错误定义所影响性能浅析

    前景提要: 编写程序时,也许你不经意间,就不知不觉的定义了错误的类型,从而发生了额外的性能消耗,从而降低了效率,不要说就发生那么一次两次,如果说是程序中发生了循环.网络程序(不断请求处理的)等这些时候 ...

  9. uboot环境变量分析

    uboot的环境变量在程序的运行和调试过程中都发挥着比较重要的作用. 一.环境变量 可以理解为全局变量,但是他的生命周期比全局变量要长,当程序已经结束运行时,全局变量就会消亡,但是环境变量在下次上电运 ...

  10. 工作总结:MFC调用Windows自带新建、保存对话框代码

    保存: void CExample17Dlg::OnBnClickedSaveButton() { // TODO: Add your control notification handler cod ...