您的位置:首页 > 运维架构

12.PackageManager&&Popwindow必须设置背景

2017-02-19 23:11 169 查看
Popwindow

mLvApp.setOnItemClickListener(new OnItemClickListener() {
4000

@ViewInject(R.id.tv_uninstall)
TextView tvUnInstall;
@ViewInject(R.id.tv_open)
TextView tvOpen;
@ViewInject(R.id.tv_share)
TextView tvShare;
@ViewInject(R.id.tv_info)
TextView tvInfo;

@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// if (position == userAppInfos.size()) {
// return;
// }
View contentView = View.inflate(getApplicationContext(),
R.layout.view_app_popup, null);
mPopupWindow = new PopupWindow(contentView,
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT, true);
// popupWindow.setOutsideTouchable(true);
// PopupWindow的小bug:假如不设置,外面都无法点击了
mPopupWindow.setBackgroundDrawable(new ColorDrawable(
Color.WHITE));
// xutils
ViewUtils.inject(this, contentView);
// px -- dp
mPopupWindow.showAsDropDown(view, px2dp(60), -view.getHeight());

final AppInfo appInfo = position < userAppInfos.size() ? userAppInfos
.get(position) : sysAppInfos.get(position
- userAppInfos.size() - 1);

// 设置点击事件
// 卸载
tvUnInstall.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("android.intent.action.DELETE");
intent.addCategory("android.intent.category.DEFAULT");
intent.setData(Uri.parse("package:"
+ appInfo.packageName));
startActivity(intent);

if (mPopupWindow != null) {
mPopupWindow.dismiss();
}
}
});

// 打开
tvOpen.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
PackageManager pm = getPackageManager();
Intent intent = pm
.getLaunchIntentForPackage(appInfo.packageName);
startActivity(intent);
if (mPopupWindow != null) {
mPopupWindow.dismiss();
}
}
});

tvShare.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_SENDTO, Uri
.parse("smsto:"));
intent.putExtra("sms_body", "分享某软件");
startActivity(intent);
if (mPopupWindow != null) {
mPopupWindow.dismiss();
}
}
});

tvInfo.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
intent.addCategory("android.intent.category.DEFAULT");
intent.setData(Uri.parse("package:"
+ appInfo.packageName));
startActivity(intent);

if (mPopupWindow != null) {
mPopupWindow.dismiss();
}
}
});
}
});

1 获取app信息的封装类

package org.heima.mobilesafe01.engine;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.heima.mobilesafe01.bean.AppInfo;
import org.heima.mobilesafe01.utils.L;

import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;

/**
* @author U 软件管家数据提供者
*/
public class AppProvider {

public static List<AppInfo> getAllAppInfos(Context context) {
List<AppInfo> infos = new ArrayList<AppInfo>();
PackageManager pm = context.getPackageManager();
List<PackageInfo> installedPackages = pm.getInstalledPackages(0);
for (PackageInfo packageInfo : installedPackages) {
AppInfo info = new AppInfo();
info.packageName = packageInfo.packageName;
info.icon = packageInfo.applicationInfo.loadIcon(pm);
info.name = packageInfo.applicationInfo.loadLabel(pm).toString();
// packageInfo.applicationInfo.name;
// 安装包的大小
String sourceDir = packageInfo.applicationInfo.sourceDir;
// L.d("sourcedir:" + sourceDir);
File file = new File(sourceDir);
info.size = file.length();
//
int flags = packageInfo.applicationInfo.flags;

// packageInfo.applicationInfo.FLAG_SYSTEM
// ApplicationInfo.FLAG_EXTERNAL_STORAGE:0000 0010
// ApplicationInfo.FLAG_SYSTEM=0000 0001
// flags=0000 0011
if ((flags & ApplicationInfo.FLAG_SYSTEM) == ApplicationInfo.FLAG_SYSTEM) {// 0001
// 0011
// 0001
info.isSystem = true; // 0001
// 0000
// 0001
} else {
info.isSystem = false;
}
if ((flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) == ApplicationInfo.FLAG_EXTERNAL_STORAGE) {
// 0000 0011
// 0000 0010
// 0000 0010
info.isInstallSD = true;
} else {
info.isInstallSD = false;
}
// L.d(String.valueOf(info.name+":"+Integer.toBinaryString(flags)));
infos.add(info);
}
return infos;
}
}


2 AppManagerActivity的布局文件

<?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" >

<TextView
style="@style/TvTitleStyle"
android:text="软件管家" />

<org.heima.mobilesafe01.view.DesProgressView
android:id="@+id/dpv_ram"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<org.heima.mobilesafe01.view.DesProgressView
android:id="@+id/dpv_sd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="1dp" />

<include layout="@layout/view_lv_app_head" />

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >

<ListView
android:id="@+id/lv_app"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="#e7e7e7"
android:dividerHeight="1dp"
android:scrollbars="none" >
</ListView>

<ProgressBar
android:id="@+id/pb_app_loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:indeterminateDrawable="@drawable/pd_loadind_rotate" />
</RelativeLayout>

</LinearLayout>

3 DesProgressView
package org.heima.mobilesafe01.view;

import org.heima.mobilesafe01.R;

import android.content.Context;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;

/**
* @author U 自定义进度条的描述
*/
public class DesProgressView extends LinearLayout {
@ViewInject(R.id.tv_title_type)
private TextView tvTitleType;
@ViewInject(R.id.pb_des)
private ProgressBar pdDes;
@ViewInject(R.id.tv_left)
private TextView tvLeft;
@ViewInject(R.id.tv_right)
private TextView tvRight;

public DesProgressView(Context context) {
this(context, null);
}

public DesProgressView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}

public DesProgressView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
View.inflate(getContext(), R.layout.view_des_progerss, this);
ViewUtils.inject(this);
}

public void setTitleType(String type) {
if (TextUtils.isEmpty(type)) {
throw new IllegalArgumentException("type can not be null");
}
tvTitleType.setText(type);
}

public void setLeftMsg(String left) {
if (TextUtils.isEmpty(left)) {
throw new IllegalArgumentException("left can not be null");
}
tvLeft.setText(left);
}

public void setRightMsg(String right) {
if (TextUtils.isEmpty(right)) {
throw new IllegalArgumentException("right can not be null");
}
tvRight.setText(right);
}

public void setProgerss(int progress) {
pdDes.setProgress(progress);
}

}


4 AppManagerActivity
package org.heima.mobilesafe01;

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.heima.mobilesafe01.bean.AppInfo;
import org.heima.mobilesafe01.engine.AppProvider;
import org.heima.mobilesafe01.utils.L;
import org.heima.mobilesafe01.view.DesProgressView;

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.os.Environment;
import android.os.SystemClock;
import android.text.format.Formatter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
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.ListView;
import android.widget.PopupWindow;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ContentView;
import com.lidroid.xutils.view.annotation.ViewInject;

/**
* @author U 软件管家
*/
@ContentView(R.layout.activity_app_manager)
public class AppManagerActivity extends Activity {
@ViewInject(R.id.dpv_ram)
private DesProgressView dpvRam;
@ViewInject(R.id.dpv_sd)
private DesProgressView dpvSd;
@ViewInject(R.id.lv_app)
private ListView mLvApp;
@ViewInject(R.id.pb_app_loading)
private ProgressBar pbLoading;
@ViewInject(R.id.tv_app)
private TextView tvApp;

private List<AppInfo> allAppInfos = new ArrayList<AppInfo>();
private List<AppInfo> userAppInfos = new ArrayList<AppInfo>();
private List<AppInfo> sysAppInfos = new ArrayList<AppInfo>();
private PopupWindow mPopupWindow;
private AppManagerAdapter mAppManagerAdapter;
private UnInstallReceiver mReceiver;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initView();
initData();
initEvent();
}

private void initView() {
ViewUtils.inject(this);
}

private void initData() {
initHeadData();
pbLoading.setVisibility(View.VISIBLE);
tvApp.setVisibility(View.GONE);
new Thread(new Runnable() {

@Override
public void run() {
allAppInfos = AppProvider
.getAllAppInfos(getApplicationContext());
// 区分集合
for (AppInfo appInfo : allAppInfos) {
if (appInfo.isSystem) {
sysAppInfos.add(appInfo);
} else {
userAppInfos.add(appInfo);
}
}
SystemClock.sleep(1000);
runOnUiThread(new Runnable() {

@Override
public void run() {
tvApp.setVisibility(View.VISIBLE);
tvApp.setText("用户程序(" + userAppInfos.size() + ")个");
mAppManagerAdapter = new AppManagerAdapter();
mLvApp.setAdapter(mAppManagerAdapter);
pbLoading.setVisibility(View.GONE);
}
});
}
}).start();

// 注册卸载apk的广播
mReceiver = new UnInstallReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_PACKAGE_REMOVED);// 千万不要用这个Intent.ACTION_UNINSTALL_PACKAGE
filter.addDataScheme("package");
registerReceiver(mReceiver, filter);
}

private void initEvent() {
mLvApp.setOnScrollListener(new OnScrollListener() {

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {

}

@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if (firstVisibleItem <= userAppInfos.size()) {
tvApp.setText("用户程序(" + userAppInfos.size() + ")个");
} else {
tvApp.setText("系统程序(" + sysAppInfos.size() + ")个");
}
}
});

mLvApp.setOnItemClickListener(new OnItemClickListener() {
@ViewInject(R.id.tv_uninstall)
TextView tvUnInstall;
@ViewInject(R.id.tv_open)
TextView tvOpen;
@ViewInject(R.id.tv_share)
TextView tvShare;
@ViewInject(R.id.tv_info)
TextView tvInfo;

@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// if (position == userAppInfos.size()) {
// return;
// }
View contentView = View.inflate(getApplicationContext(),
R.layout.view_app_popup, null);
mPopupWindow = new PopupWindow(contentView,
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT, true);
// popupWindow.setOutsideTouchable(true);
// PopupWindow的小bug:假如不设置,外面都无法点击了
mPopupWindow.setBackgroundDrawable(new ColorDrawable(
Color.WHITE));
// xutils
ViewUtils.inject(this, contentView);
// px -- dp
mPopupWindow.showAsDropDown(view, px2dp(60), -view.getHeight());

final AppInfo appInfo = position < userAppInfos.size() ? userAppInfos
.get(position) : sysAppInfos.get(position
- userAppInfos.size() - 1);

// 设置点击事件
// 卸载
tvUnInstall.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("android.intent.action.DELETE");
intent.addCategory("android.intent.category.DEFAULT");
intent.setData(Uri.parse("package:"
+ appInfo.packageName));
startActivity(intent);

if (mPopupWindow != null) {
mPopupWindow.dismiss();
}
}
});

// 打开
tvOpen.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
PackageManager pm = getPackageManager();
Intent intent = pm
.getLaunchIntentForPackage(appInfo.packageName);
startActivity(intent);
if (mPopupWindow != null) {
mPopupWindow.dismiss();
}
}
});

tvShare.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_SENDTO, Uri
.parse("smsto:"));
intent.putExtra("sms_body", "分享某软件");
startActivity(intent);
if (mPopupWindow != null) {
mPopupWindow.dismiss();
}
}
});

tvInfo.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
intent.addCategory("android.intent.category.DEFAULT");
intent.setData(Uri.parse("package:"
+ appInfo.packageName));
startActivity(intent);

if (mPopupWindow != null) {
mPopupWindow.dismiss();
}
}
});
}
});
}

// px to dp
public int px2dp(int px) {
// dp: 10dp
float mDensity = getResources().getDisplayMetrics().density;// 在不同手机里面:l:0.75,m:1,h:1.5,xh:2
// L.d("mDensity:"+mDensity);
// dp*mDensity=px;
// dp=px/mDensity
return (int) (px / mDensity + 0.5f);
}

private void initHeadData() {
dpvRam.setTitleType("内存");
File dataDir = Environment.getDataDirectory();
// L.d(dataDir.getAbsolutePath());
long ramFreeSpace = dataDir.getFreeSpace();
long ramTalSpace = dataDir.getTotalSpace();
long ramUsedSpace = ramTalSpace - ramFreeSpace;
String ramFree = Formatter.formatFileSize(getApplicationContext(),
ramFreeSpace);// bit byte kb MB GB TB
String ramUsed = Formatter.formatFileSize(getApplicationContext(),
ramUsedSpace);
dpvRam.setLeftMsg(ramUsed);
dpvRam.setRightMsg(ramFree);
dpvRam.setProgerss((int) (ramUsedSpace * 100 / ramTalSpace));

// sd
dpvSd.setTitleType("SD");
File exFile = Environment.getExternalStorageDirectory();
long sdFreeSpace = exFile.getFreeSpace
aefa
();
long sdTotalSpace = exFile.getTotalSpace();
long sdUsedSpace = sdTotalSpace - sdFreeSpace;

String sdFree = Formatter.formatFileSize(getApplicationContext(),
sdFreeSpace);// bit byte kb MB GB TB
String sdUsed = Formatter.formatFileSize(getApplicationContext(),
sdUsedSpace);
dpvSd.setLeftMsg(sdUsed);
dpvSd.setRightMsg(sdFree);
dpvSd.setProgerss((int) (sdUsedSpace * 100 / sdTotalSpace));
}

class AppManagerAdapter extends BaseAdapter {
LayoutInflater mInflater;

public AppManagerAdapter() {
mInflater = LayoutInflater.from(getApplicationContext());
}

@Override
public int getCount() {
return userAppInfos.size() + sysAppInfos.size() + 1;
}

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

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
/*
* <TextView android:id="@+id/tv_app"
* android:layout_width="match_parent" android:layout_height="35dp"
* android:background="#55ff0000" android:text="用户"
* android:textColor="#000000" android:textSize="17sp"
* android:gravity="center_vertical" android:paddingLeft="10dp" />
*/
// if (position == userAppInfos.size()) {
// TextView tv = new TextView(getApplicationContext());
// ListView.LayoutParams params = new ListView.LayoutParams(
// ListView.LayoutParams.MATCH_PARENT, 35);
// tv.setLayoutParams(params);
// tv.setText("系统程序(" + sysAppInfos.size() + ")个");
// tv.setBackgroundColor(Color.parseColor("#55ff0000"));
// tv.setTextColor(Color.parseColor("#000000"));
// tv.setTextSize(17);
// tv.setGravity(Gravity.CENTER_VERTICAL);
// tv.setPadding(10, 0, 0, 0);
// return tv;
// }

if (position == userAppInfos.size()) {
TextView tv = (TextView) mInflater.inflate(
R.layout.view_lv_app_head, parent, false);
tv.setText("系统程序(" + sysAppInfos.size() + ")个");
return tv;
}

ViewHolder viewHolder;
if (convertView == null || (convertView instanceof TextView)) {
viewHolder = new ViewHolder();
convertView = mInflater.inflate(R.layout.view_app_item_lv,
parent, false);
viewHolder.ivIcon = (ImageView) convertView
.findViewById(R.id.iv_icon);
viewHolder.tvAppName = (TextView) convertView
.findViewById(R.id.tv_app_name);
viewHolder.tvInstallSd = (TextView) convertView
.findViewById(R.id.tv_install_sd);
viewHolder.tvAppSize = (TextView) convertView
.findViewById(R.id.tv_app_size);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
AppInfo appInfo = null;
if (position < userAppInfos.size()) {// 7<8
appInfo = userAppInfos.get(position);
} else {
appInfo = sysAppInfos.get(position - userAppInfos.size() - 1);// 8
// 8
}
viewHolder.ivIcon.setImageDrawable(appInfo.icon);
viewHolder.tvAppName.setText(appInfo.name);
viewHolder.tvInstallSd
.setText(appInfo.isInstallSD ? "SD卡" : "手机内存");
viewHolder.tvAppSize.setText(Formatter.formatFileSize(
getApplicationContext(), appInfo.size));
return convertView;
}

@Override
public boolean isEnabled(int position) {
if (position == userAppInfos.size()) {
return false;
}
return super.isEnabled(position);
}
}

class ViewHolder {
ImageView ivIcon;
TextView tvAppName;
TextView tvInstallSd;
TextView tvAppSize;
}

class UnInstallReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
String data = intent.getDataString();
L.d(data);// package:org.heima.mobilesafe01
String packageName = data.replace("package:", "");

// 用户激活删除
Iterator<AppInfo> iterator = userAppInfos.iterator();
while (iterator.hasNext()) {
AppInfo appInfo = iterator.next();
if (appInfo.packageName.equals(packageName)) {
iterator.remove();
}
}

if (mAppManagerAdapter != null) {
mAppManagerAdapter.notifyDataSetChanged();
}

// 消耗PopupWindow
if (mPopupWindow != null) {
mPopupWindow.dismiss();
}
}

}

@Override
protected void onDestroy() {
super.onDestroy();
if (mReceiver != null) {
unregisterReceiver(mReceiver);
}
}

}


之前写的跟PackageManager有关的
package org.heima.mobilesafe01.utils;

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;

public class PackageUtils {

// 获取版本名字
public static String getVersionName(Context context) {
PackageManager pm = context.getPackageManager();
try {
PackageInfo packageInfo = pm.getPackageInfo(
context.getPackageName(), 0);
return packageInfo.versionName;
} catch (NameNotFoundException e) {
e.printStackTrace();
}
return null;
}

// 获取版本号
public static int getVersionCode(Context context) {
PackageManager pm = context.getPackageManager();
try {
PackageInfo packageInfo = pm.getPackageInfo(
context.getPackageName(), 0);
return packageInfo.versionCode;
} catch (NameNotFoundException e) {
e.printStackTrace();
}
return -1;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: