###1.应用程序信息的flags

1. int flags = packageInfo.applicationInfo.flags
2. 0000 0000 0000 0000 0000 0000 0000 0000 //int的32位每一位的0或者1表示一个boolean值
3. 适用于需要大量boolean变量的场景,提高效率
4. 具体代码

int flags = packInfo.applicationInfo.flags;
if ((flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
//系统应用
} else {
//用户应用
}
if ((flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
//安装在sd卡
} else {
//安装在手机内存
}

###2.应用的安装位置
<manifest
... SD卡 手机内存 手机内存
android:installLocation="preferExternal | internalOnly | auto"
/>

###3.如何区分显示系统应用和用户应用
1. 将“应用程序集合”拆分成“用户程序集合”和“系统程序集合”两个集合
2. 在getView方法中,根据position判断,该位置应该是用户程序还是系统程序,在从对应的集合中取出数据
3. 注意,当显示第二个集合的数据时,需要对position进行修正

###4.将标签加入到ListView的item中显示
1. 在getCount中计算出正确的个数:用户程序个数+系统程序个数+标签个数
2. 在getView中,根据position判断需要显示的四种类型:用户程序标签、用户程序、系统程序标签、系统程序,根据不同的类型返回不同的view
3. 注意,标签是插在列表的前面和中间,需要对position进行修正

###5.ListView的item具有多种布局
当我们在Adapter中调用方法getView的时候,如果整个列表中的Item View如果有多种类型布局,如:

![](http://i.imgur.com/ug4MqzT.jpg)

我们继续使用convertView来将数据从新填充貌似不可行了,因为每次返回的convertView类型都不一样,无法重用。

Android在设计上的时候,也想到了这点。所以,在adapter中预留的两个方法。

public int getViewTypeCount(); //有多少种布局类型
public int getItemViewType(int position); //获取某个位置是哪种类型类型

只需要重写这两个方法,设置一下ItemViewType的个数和判断方法,Recycler就能有选择性的给出不同的convertView了。

private static final int TYPE_LABEL = 0;
private static final int TYPE_CONTENT = 1;

private class AppManagerAdapter extends BaseAdapter{

@Override
public int getViewTypeCount() {
return 2;
}

@Override
public int getItemViewType(int position) {
if(position == 0 || position == userAappInfos.size()+1){
return TYPE_LABEL;
}else{
return TYPE_CONTENT;
}
}

/**
* 返回listview里面有多少个条目
*/
@Override
public int getCount() {
//为什么要加两个1 , 增加了两个textview的标签。整个listview条目的个数增加了。
return 1+userAappInfos.size()+1+systemAppInfos.size();
}

/**
* 显示每个条目的view对象
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LabelViewHolder labelViewHolder = null;
ContentViewHolder contentViewHolder = null;

int type = getItemViewType(position);
if(convertView == null){
switch (type) {
case TYPE_LABEL:
convertView = new TextView(AppManagerActivity.this);
labelViewHolder = new LabelViewHolder();
labelViewHolder.tv_label = (TextView) convertView;
labelViewHolder.tv_label.setBackgroundColor(Color.GRAY);
convertView.setTag(labelViewHolder);
break;
case TYPE_CONTENT:
convertView = View.inflate(getApplicationContext(), R.layout.item_appinfo, null);
contentViewHolder = new ContentViewHolder();
contentViewHolder.iv_appIcon = (ImageView) convertView.findViewById(R.id.iv_appicon);
contentViewHolder.tv_appName = (TextView) convertView.findViewById(R.id.tv_appName);
contentViewHolder.tv_apkSize = (TextView) convertView.findViewById(R.id.tv_apkSize);
contentViewHolder.iv_install_location = (ImageView) convertView.findViewById(R.id.iv_install_location);
convertView.setTag(contentViewHolder);
break;
}
}else{
switch (type) {
case TYPE_LABEL:
labelViewHolder = (LabelViewHolder) convertView.getTag();
break;
case TYPE_CONTENT:
contentViewHolder = (ContentViewHolder) convertView.getTag();
break;
}
}

switch (type) {
case TYPE_LABEL:
if(position == 0){
labelViewHolder.tv_label.setText("用户程序:"+userAappInfos.size());
}else{
labelViewHolder.tv_label.setText("系统程序:"+systemAppInfos.size());
}
break;
case TYPE_CONTENT:
AppInfo appInfo;
if(position<=userAappInfos.size()){//用户程序
int newPosition = position - 1;//减去用户的标签textview占据的位置
appInfo = userAappInfos.get(newPosition);
}else {//系统程序
int newPosition = position - 1 - userAappInfos.size() - 1;
appInfo = systemAppInfos.get(newPosition);
}

contentViewHolder.iv_appIcon.setImageDrawable(appInfo.getAppIcon());
contentViewHolder.tv_appName.setText(appInfo.getAppName());
contentViewHolder.tv_apkSize.setText("程序大小:"+Formatter.formatFileSize(getApplicationContext(), appInfo.getAppSize()));
if(appInfo.isInRom()){
contentViewHolder.iv_install_location.setImageResource(R.drawable.memory);
}else{
contentViewHolder.iv_install_location.setImageResource(R.drawable.sd);
}
break;
}

return convertView;
}

@Override
public Object getItem(int position) {
return null;
}

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

/**
* 存放内容孩子对象的引用
*/
static class ContentViewHolder{
ImageView iv_appIcon;
TextView tv_appName;
TextView tv_apkSize;
ImageView iv_install_location;
}

/**
* 存放标签孩子对象的引用
*/
static class LabelViewHolder{
TextView tv_label;
}

###6.ListView的OnScrollListener--滑动监听器
public static int SCROLL_STATE_IDLE = 0; //停止
public static int SCROLL_STATE_TOUCH_SCROLL = 1; //手指拖动
public static int SCROLL_STATE_FLING = 2; //惯性滑动

listView.setonScrollListener(new OnScrollListener() {

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
//滚动状态发生变化。0停止,1手指拖动,2惯性滑动
}

@Override
public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {
//当listview正在滚动的时候调用的方法
//firstVisibleItem:第一个显示的Item的位置
//visibleItemCount:可显示的Item的总数
//totalItemCount:Item的总数
}
});

###7.PopupWindow的使用
//创建,指定显示的View和宽高
PopupWindow ppw = new PopupWindow(View contentView, int width, int height);
//显示,parent并不是指要把contentView 添加到parent上,而是要获取token
ppw. showAtLocation(View parent, int gravity, int x, int y);
//关闭
ppw. dismiss();

###8.PopupWindow使用注意事项
1.在show之前dismiss掉之前创建的,避免重复显示
2.在Activity的onDestory()的时候dismiss,避免窗体泄漏

###9.获取View在Window中的位置
int[] location = new int[2];
view.getLocationInWindow(location);
Location[0]: x坐标
Location[1]: y坐标

获取View在父View中的位置
view.getX();
view.getY();

###10.PopupWindow不显示动画的原因
1.手机中设置了动画关闭
2.PopupWindow没有设置背景

注:PopupWindow要设置背景和获取焦点,才能有点击弹框外消失的效果

###1.卸载应用的Intent
卸载请求

Intent intent = new Intent();
intent.setAction("android.intent.action.DELETE");
intent.addCategory("android.intent.category.DEFAULT");
intent.setData(Uri.parse("package:"+clickedAppInfo.getPackName()));
startActivity(intent);
安装请求

Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.setDataAndType(
Uri.fromFile(new File(apk_path)),
"application/vnd.android.package-archive");
startActivity(intent);

###2.接收卸载应用程序的广播
AppUninstallReceiver receiver = new AppUninstallReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
filter.addDataScheme("package");
registerReceiver(receiver, filter);

* **相关广播**
* ACTION\_PACKAGE\_ADDED 一个新应用包已经安装在设备上,数据包括包名(最新安装的包程序不能接收到这个广播,(当前正在安装的程序不能接收这个广播))
* ACTION\_PACKAGE\_REPLACED 一个新版本的应用安装到设备,替换之前已经存在的版本
* ACTION\_PACKAGE\_REMOVED 一个已存在的应用程序包已经从设备上移除,包括包名(正在被卸载的包程序不能接收到这个广播)
###3.遍历集合时如何删除数据
方法一:高级for循环,记录要删除的数据,遍历后再删除
AppInfo deleteAppInfo = null;
//更新ui界面
for(AppInfo appinfo: userAppInfos){
if(appinfo.getPackName().equals(packname)){
deleteAppInfo = appinfo;
}
}
if(deleteAppInfo!=null){
userAppInfos.remove(deleteAppInfo);
}

方法二:使用迭代器进行遍历,可在遍历中删除
Iterator<AppInfo> iterator = userAppInfos.iterator();
while(iterator.hasNext()){
AppInfo appinfo = iterator.next();
if (appinfo.getPackName().equals(packname)) {
iterator.remove();
}
}

方法三:使用普通for循环倒叙,可在遍历中删除。注意:如不采用倒叙,会遍历不全
for (int i = userAppInfos.size() - 1; i >= 0; i--) {
AppInfo appinfo = userAppInfos.get(i);
if (appinfo.getPackName().equals(packname)) {
userAppInfos.remove(i);
break;
}
}

###4.启动一个应用程序
PackageManager pm = getPackageManager();
Intent intent = pm.getLaunchIntentForPackage(clickedAppInfo.getPackName());
if(intent!=null){
startActivity(intent);
}else{
Toast.makeText(this, "对不起,该应用无法被开启", 0).show();
}

###5.分享
Intent intent = new Intent();
intent.setAction("android.intent.action.SEND");
intent.addCategory("android.intent.category.DEFAULT");
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, "推荐你使用一款软件:"+clickedAppInfo.getAppName()+",真的很好用哦");
startActivity(intent);

###6.详细信息
Intent intent = new Intent("android.settings.APPLICATION_DETAILS_SETTINGS");
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setData(Uri.parse("package:"+clickedAppInfo.getPackName()));
startActivity(intent);

主要代码:

 package com.hb.mobilesafe.activities;

 import java.util.ArrayList;
import java.util.List; import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.text.format.Formatter;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.view.animation.Animation;
import android.view.animation.ScaleAnimation;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast; import com.hb.demo_mobilesafe.R;
import com.hb.mobilesafe.bean.mPackageInfo;
import com.hb.mobilesafe.utils.MermorySize;
import com.hb.mobilesafe.utils.PackageInfoUtil; public class SoftwareManagerActivity extends Activity implements OnClickListener{
private TextView tv_software_count;
private TextView tv_rom_available;
private TextView tv_sdcard_available;
private List<mPackageInfo> appInfo;
private List<mPackageInfo> userInfo;
private List<mPackageInfo> sysInfo;
private ListView lv_show_allapp;
private LinearLayout ll_progressbar;
private MyAdapter adapter;
private PopupWindow pw;
private mPackageInfo mInfo;
private LinearLayout ll_uninstall,ll_start,ll_share,ll_information;
private MyReceiver receiver; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_softmanager);
initView();
initDate(); }
private void initView() {
tv_rom_available=(TextView) findViewById(R.id.tv_rom_available);
tv_sdcard_available=(TextView) findViewById(R.id.tv_sdcard_available);
lv_show_allapp=(ListView) findViewById(R.id.lv_show_allapp);
ll_progressbar=(LinearLayout) findViewById(R.id.ll_progressbar);
tv_software_count=(TextView) findViewById(R.id.tv_software_count);
}
private void initDate() {
// mInfo=new mPackageInfo();
//rom可用
tv_rom_available.setText("机身内存可用:"+Formatter.formatFileSize(this, MermorySize.getMermory()));
//sdcard可用
tv_sdcard_available.setText("SD卡内存可用:"+Formatter.formatFileSize(this, MermorySize.getSd())); ll_progressbar.setVisibility(View.VISIBLE);
new Thread(){
public void run() {
appInfo = PackageInfoUtil.getAppInfo(SoftwareManagerActivity.this);
isSysUserApp();
adapter = new MyAdapter();
runOnUiThread(new Runnable() {
public void run() {
lv_show_allapp.setAdapter(adapter);
ll_progressbar.setVisibility(View.INVISIBLE); }
}); };
}.start();
lv_show_allapp.setOnScrollListener(new OnScrollListener() {
//滑动后发生改变
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) { }
//正在滑动
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if(pw !=null){
pw.dismiss();
pw=null;
}
if(userInfo !=null && sysInfo !=null){ if(firstVisibleItem == 0){
tv_software_count.setVisibility(View.GONE);
}
//else if(firstVisibleItem == userInfo.size()+1){
//tv_software_count.setVisibility(View.GONE);
//}
else{
tv_software_count.setVisibility(View.VISIBLE);
}
if(firstVisibleItem <=userInfo.size()){
tv_software_count.setText("用户程序:"+userInfo.size());
}else{
tv_software_count.setText("系统程序:"+sysInfo.size());
}
}
}
});
lv_show_allapp.setOnItemClickListener(new OnItemClickListener() { @Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
//判断如果点击的是两个TextView就让他什么都不执行
if(position == 0 || position ==userInfo.size()+1){
return;
}
if(pw != null){
pw.dismiss();
pw=null; }//判断是系统应用还是用户应用
else if(position<userInfo.size()+1){
//用户应用位置
mInfo=userInfo.get(position-1);
}else{
//系统应用位置
mInfo=sysInfo.get(position-2-userInfo.size());
} View conver = View.inflate(SoftwareManagerActivity.this, R.layout.popuopwindow_item,null);
pw = new PopupWindow(conver, -2, -2); //获取点击位置
int [] location=new int [2];
view.getLocationInWindow(location);
//设置窗体的一个缩放动画
ScaleAnimation sa = new ScaleAnimation(0.3f, 1f, 0.3f, 1f, Animation.RELATIVE_TO_SELF, Animation.RELATIVE_TO_SELF);
//设置缩放时间
sa.setDuration(500); //设置窗体的背景(透明的)
pw.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
//设置显示的位置
pw.showAtLocation(parent, Gravity.RIGHT+Gravity.TOP, 30, location[1]-20);
//pw.setContentView(conver);
//开启动画
conver.startAnimation(sa); ll_uninstall=(LinearLayout) conver.findViewById(R.id.ll_uninstall);
ll_start=(LinearLayout) conver.findViewById(R.id.ll_start);
ll_share=(LinearLayout) conver.findViewById(R.id.ll_share);
ll_information=(LinearLayout) conver.findViewById(R.id.ll_information);
ll_uninstall.setOnClickListener(SoftwareManagerActivity.this);
ll_start.setOnClickListener(SoftwareManagerActivity.this);
ll_information.setOnClickListener(SoftwareManagerActivity.this);
ll_information.setOnClickListener(SoftwareManagerActivity.this); } }); } @Override
public void onClick(View v) {
Intent intent;
switch (v.getId()) {
//卸载
case R.id.ll_uninstall:
String packageName = mInfo.getPackageName();
System.out.println("packageName:"+packageName);
intent= new Intent();
if(packageName.equals("com.hb.demo_mobilesafe")){
Toast.makeText(SoftwareManagerActivity.this, "您不能卸载当前App", 0).show();
pw.dismiss();
return;
}
intent.setAction("android.intent.action.DELETE");
intent.addCategory("android.intent.category.DEFAULT");
intent.setData(Uri.parse("package:"+packageName));
startActivity(intent); IntentFilter filter=new IntentFilter();
filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
filter.addDataScheme("package");
receiver = new MyReceiver();
registerReceiver(receiver, filter); break;
//启动
case R.id.ll_start:
PackageManager pm=getPackageManager();
intent = pm.getLaunchIntentForPackage(mInfo.getPackageName());
if(intent !=null){
startActivity(intent);
pw.dismiss();
} break;
//分享
case R.id.ll_share:
intent = new Intent();
intent.setAction("android.intent.action.SEND");
intent.addCategory("android.intent.category.DEFAULT");
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, "推荐你使用一款软件:"+mInfo.getAppName()+",真的很好用哦");
startActivity(intent);
break;
//信息
case R.id.ll_information:
intent = new Intent("android.settings.APPLICATION_DETAILS_SETTINGS");
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setData(Uri.parse("package:"+mInfo.getPackageName()));
startActivity(intent);
break;
} }
private class MyAdapter extends BaseAdapter{
@SuppressLint("ViewHolder") @Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView !=null && convertView instanceof LinearLayout){
holder=(ViewHolder) convertView.getTag(); }else{
holder=new ViewHolder();
convertView=View.inflate(SoftwareManagerActivity.this, R.layout.appinfo_item, null);
holder.appIcon=(ImageView) convertView.findViewById(R.id.iv_app_icon);
holder.appName=(TextView) convertView.findViewById(R.id.tv_pro_name);
holder.appSize=(TextView) convertView.findViewById(R.id.tv_app_size);
holder.appLocation=(ImageView) convertView.findViewById(R.id.iv_location);
convertView.setTag(holder);
}
if(position == 0){
TextView tv0= new TextView(SoftwareManagerActivity.this);
if(userInfo.size()==0){
tv0.setHeight(0);
return tv0;
}
tv0.setClickable(false);
tv0.setTextColor(Color.WHITE);
tv0.setBackgroundColor(Color.GRAY);
tv0.setText("用户程序:"+userInfo.size());
return tv0;
}else if(position ==userInfo.size()+1){
TextView tv1= new TextView(SoftwareManagerActivity.this);
tv1.setClickable(false);
tv1.setTextColor(Color.WHITE);
tv1.setBackgroundColor(Color.GRAY);
tv1.setText("系统程序:"+sysInfo.size());
return tv1;
}else if(position <= userInfo.size()){
int newPosition = position-1;
boolean sd = userInfo.get(newPosition).isSd();
if(sd){
holder.appLocation.setBackgroundResource(R.drawable.sd);
}else{
holder.appLocation.setBackgroundResource(R.drawable.memory);
}
holder.appIcon.setImageDrawable(userInfo.get(newPosition).getIcon());
holder.appName.setText(userInfo.get(newPosition).getAppName());
holder.appSize.setText("程序大小:"+Formatter.formatFileSize(SoftwareManagerActivity.this, userInfo.get(newPosition).getAppSize()));
}else{
int newPosition=position -userInfo.size()-2;
boolean sd = sysInfo.get(newPosition).isSd();
if(sd){
holder.appLocation.setBackgroundResource(R.drawable.sd);
}else{
holder.appLocation.setBackgroundResource(R.drawable.memory);
}
holder.appIcon.setImageDrawable(sysInfo.get(newPosition).getIcon());
holder.appName.setText(sysInfo.get(newPosition).getAppName());
holder.appSize.setText("程序大小:"+Formatter.formatFileSize(SoftwareManagerActivity.this, sysInfo.get(newPosition).getAppSize()));
}
return convertView;
} @Override
public int getCount() {
/**
* 返回系统应用与用户应用的数量
*/
return sysInfo.size()+1+userInfo.size()+1;
} @Override
public Object getItem(int position) {
return null;
} @Override
public long getItemId(int position) {
return 0;
} }
class ViewHolder{
ImageView appIcon;
ImageView appLocation;
TextView appName;
TextView appSize; }
/**
* 判断是系统应用还是用户应用
*/
private void isSysUserApp(){
userInfo = new ArrayList<mPackageInfo>();
sysInfo = new ArrayList<mPackageInfo>();
for (mPackageInfo Info : appInfo) {
boolean men = Info.isMen();
if(men){
sysInfo.add(Info);
}else{
userInfo.add(Info);
}
}
}
class MyReceiver extends BroadcastReceiver{ @Override
public void onReceive(Context context, Intent intent) {
String packcageName=null;
mPackageInfo tag=null;
String data = intent.getData().toString(); unregisterReceiver(this); if(data != null){ packcageName = data.replace("package:", ""); }
for (mPackageInfo info : appInfo) { if(info.getPackageName().equals(packcageName)){
tag=info;
}
}
if(appInfo != null){
System.out.println("程序卸载已经更新"+tag);
appInfo.remove(tag);
isSysUserApp();
adapter.notifyDataSetChanged();
} } } }
 package com.hb.mobilesafe.utils;

 import java.io.File;
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 android.os.SystemClock; import com.hb.mobilesafe.bean.mPackageInfo; public class PackageInfoUtil {
public static List<mPackageInfo> getAppInfo(Context context){
List<mPackageInfo> list=new ArrayList<mPackageInfo>(); PackageManager pm = context.getPackageManager();
List<PackageInfo> packages = pm.getInstalledPackages(0);
for (PackageInfo info1 : packages) {
mPackageInfo info = new mPackageInfo();
Drawable appIcon = info1.applicationInfo.loadIcon(pm);
String appName = info1.applicationInfo.loadLabel(pm).toString();
String appPackageName = info1.packageName.toString();
String path = info1.applicationInfo.sourceDir.toString();
File file=new File(path);
long appSize = file.length(); int flags = info1.applicationInfo.flags;
/**
* 判断是否是系统应用
*/
if((flags & ApplicationInfo.FLAG_SYSTEM)!=0){
info.setMen(true);
}else{
info.setMen(false);
}
/**
* 判断是否是安装在sd卡上的
*/
if((flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE)!=0){
info.setSd(false);
}else {
info.setSd(true);
}
info.setAppName(appName);
info.setAppSize(appSize);
info.setIcon(appIcon);
info.setPackageName(appPackageName);
list.add(info); }
SystemClock.sleep(1200);
return list; }
}

xml:

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal" > <TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="46dp"
android:background="#A1FF80"
android:gravity="center_vertical"
android:text="程序管理"
android:textSize="20sp" /> <RelativeLayout
android:id="@+id/rl_size"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/tv_title" > <TextView
android:id="@+id/tv_rom_available"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/memory"
android:text="机身内存可用:181MB"
android:textSize="10sp" /> <TextView
android:id="@+id/tv_sdcard_available"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:drawableLeft="@drawable/sd"
android:text="SD卡内存可用:181MB"
android:textSize="10sp" />
</RelativeLayout> <TextView
android:visibility="gone"
android:textColor="#ffffff"
android:clickable="false"
android:id="@+id/tv_software_count"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/rl_size"
android:background="#888888"
android:text="用户程序:5"
/> <LinearLayout
android:id="@+id/ll_progressbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:gravity="center"
android:orientation="vertical"
android:visibility="invisible" > <ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content" /> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="正在加载中..."
android:textSize="15sp" />
</LinearLayout> <ListView
android:id="@+id/lv_show_allapp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/tv_software_count" /> </RelativeLayout>

Android项目实战_手机安全卫士软件管家的更多相关文章

  1. Android项目实战_手机安全卫士home界面

    # 安全卫士主页面# ###1.GridView控件 1.与ListView的使用方式差不多,也要使用数据适配器,通过设置android:numColumns控制显示几列 2.通过指定android: ...

  2. Android项目实战_手机安全卫士手机防盗界面

    #安全卫士手机防盗# ###1.Activity的任务栈 1.类似一个木桶,每层只能放一个木块,我们放入木块和取出木块的时候只能从最上面开始操作 ###2.Android中的坐标系![](http:/ ...

  3. Android项目实战_手机安全卫士splash界面

    - 根据代码的类型组织包结构 1. 界面 com.hb.mobilesafe.activities 2. 服务 com.hb.mobilesafe.services 3. 业务逻辑 com.hb.mo ...

  4. Android项目实战_手机安全卫士程序锁

    ###1.两个页面切换的实现1. 可以使用Fragment,调用FragmentTransaction的hide和show方法2. 可以使用两个布局,设置visibility的VISIABLE和INV ...

  5. Android项目实战_手机安全卫士系统加速

    ## 1.本地数据库自动更新的工作机制1. 开启一个服务,定时访问服务器2. 进行版本对比,如果最新版本比较高,获取需要更新的内容3. 将新内容插入到本地数据库中 ## 2.如何处理横竖屏切换1. 指 ...

  6. Android项目实战_手机安全卫士拦截骚扰

    ###1.骚扰拦截需求分析1.界面1.1 黑名单列表界面1.2 添加黑名单界面2.功能2.1 黑名单的添加.删除2.2 拦截电话2.3 拦截短信 ###2.黑名单数据库的创建1.分析需要的字段id 主 ...

  7. Android项目实战_手机安全卫士流量统计

    ## 1.抽屉控件SlidingDrawer:一定要配置android:handle(把手)和android:content(内容),并在子View中添加把手和内容的布局```java <Sli ...

  8. Android项目实战_手机安全卫士进程管理

    ###1.设备进程信息获取获取设备运行进程 ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVI ...

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

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

随机推荐

  1. HDU 1249 三角形的分割

    可以将三角形的三条边一条一条加进图形中观察 假设添加第n个三角形 前n-1个三角形将区域划分为sum[n-1] 第n个三角形每条边最多能经过前n-1个三角形每条三角形的两条边 , 一条边切完增加了 2 ...

  2. jquery转义字符之单引号

    jquery动态生成html,并且html中包含方法时,如 var varHtml = '<input type="button" value="点我删除" ...

  3. J2EE 课件3 JSP标记

    •JSP标记包括指令标记.动作标记和自定义标记.其中自定义标记主要讲述与Tag文件有关的Tag标记    1.指令标记page page 指令用来定义整个JSP页面的一些属性和这些属性的值,属性值用单 ...

  4. Hihocoder 1337 (splay)

    Problem 平衡树 SBT 题目大意 维护一个序列,支持两种操作. 操作一:插入一个数. 操作二:询问第k小的数. 解题分析 ~~刷刷水题,再熟悉一下splay的基本操作. ps:哇咔咔,有连续四 ...

  5. 夜话JAVA设计模式之策略模式

    策略模式     定义了算法簇,分别封装起来,让他们之间可以互相替换,让算法簇的变化独立于使用算法的客户.设计原则1     找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在 ...

  6. MyBatis3-传递多个参数(Multiple Parameters)

    传递多个参数一般用在查询上,比如多个条件组成的查询,有以下方式去实现: 版本信息: MyBatis:3.4.4 1.自带方法 <select id="getUserArticlesBy ...

  7. nodejs shell

    REPL (Read-eval-print loop),即输入—求值—输出循环.如果你用过 Python,就会知道在终端下运行无参数的 python 命令或者使用 Python IDLE 打开的 sh ...

  8. 友盟 个推 微信sdk spring boot

    友盟 个推 微信sdk spring boot ngix mongodb memory cache

  9. 3.5 在批处理模式下使用mysql

    在前面的章节中,你交互式地使用mysql输入查询而且查看结果.你也能够以批模式执行mysql.为了做到这些.把你想要执行的命令放在一个文件里,然后告诉mysql从文件读取它的输入: shell> ...

  10. jstl自己定义函数的使用

    因为本人之前并没有接触过jstl标签,说来也可笑,之前一直使用struts2标签.近期项目用到jstl,所以做些记录方便以后自己查看. jstl的强大原因之中的一个我觉得就是他的自己定义函数,我们能够 ...