Android 專案實戰:應用管理器Ⅰ(資料)
阿新 • • 發佈:2018-11-09
瞭解應用管理器的專案概況和功能需求
(從資料開始做)
掌握PackageManager的用法
掌握PackageInfo的常用屬性
掌握Application的常用屬性和方法
學會實體類的編寫(工具類)
完成專案的建立和資料測試
版本名為字串,版本號為數字.
開發實體類:1.在原包下New一個新包entity
2.在entity下New一個Java Class -- AppInfo
/** * Created by Administrator on 2018/8/14. * 實體類:應用的資訊 */ public class AppInfo { /** 包名 */ public String packageName; /** 版本名 */ public String versionName; /** 版本號 */ public int versionCode; /** 第一次安裝時間 */ public long insTime; /** 更新時間 */ public long updTime; /** 程式名 */ public String appName; /** 圖示 */ public Drawable icon; /** 位元組大小 */ public long byteSize; /** 大小 */ public String size; @Override //Alt+Insert選擇toString() public String toString() { return "\nAppInfo{" + "packageName='" + packageName + '\'' + ", versionName='" + versionName + '\'' + ", versionCode=" + versionCode + ", insTime=" + insTime + ", updTime=" + updTime + ", appName='" + appName + '\'' + ", icon=" + icon + ", byteSize=" + byteSize + ", size='" + size + '\'' + '}'; } }
建工具包(放工具類:跟整個專案,檢視,前臺沒有太多聯絡可以獨立出來的方法進行整合) : 1.在原包下New一個新包util
2.在util下New一個Java Class -- Utils
/** * Created by Administrator on 2018/8/14. * 工具類 */ public class Utils { public static List<AppInfo> getAppList(Context context){ // 返回值集合 List<AppInfo> list = new ArrayList<AppInfo>(); // 例項化包管理器 PackageManager pm = context.getPackageManager(); // 獲取所有已經安裝的應用資訊 List<PackageInfo> pList = pm.getInstalledPackages(0); //0為不加任何過濾條件.放回全部的安裝資訊 // 遍歷集合 for(int i = 0; i<pList.size(); i++){ PackageInfo PackageInfo = pList.get(i); //拿到元素 //把實體類例項化出來,把元素對應放入(填充實體類) AppInfo app = new AppInfo(); app.packageName = PackageInfo.packageName; //屬性值的傳遞 app.versionName = PackageInfo.versionName; app.versionCode = PackageInfo.versionCode; app.insTime = PackageInfo.firstInstallTime; app.updTime = PackageInfo.lastUpdateTime; //獲取應用名 app.appName = (String) PackageInfo.applicationInfo.loadLabel(pm); //獲取圖示 app.icon = PackageInfo.applicationInfo.loadIcon(pm); //計算程式的大小(首先獲得安裝包的絕對路徑,資料夾位置) String dir = PackageInfo.applicationInfo.publicSourceDir; //定義臨時變數,接收資料夾路徑 long byteSize = new File(dir).length(); app.byteSize = byteSize; // 實際大小 app.size = getSize(byteSize); // 格式化好的大小 //資訊裝入了實體類,但還未裝入List集合 list.add(app); } return list; } public static String getSize(long size){ //DecimalFormat格式化 return new DecimalFormat("0.##").format(size * 1.0/(1024*1024)); } }
Java程式碼
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//用集合接收傳回的返回值.獲取資料
List<AppInfo> list = Utils.getAppList(this);
Log.i("srq","list="+list.toString());
}
}
轉換時間
Utils類中加
public static String getTime(long millis){ //將毫秒數轉化為日期格式的工具方法
Date date = new Date(millis); //將毫秒數轉化為日期物件
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(date);
}
改動AppInfo中
@Override
public String toString() {
return "\nAppInfo{" +
"packageName='" + packageName + '\'' +
", versionName='" + versionName + '\'' +
", versionCode=" + versionCode +
", insTime=" + Utils.getTime(insTime) +
", updTime=" + Utils.getTime(updTime) +
", appName='" + appName + '\'' +
", icon=" + icon +
", byteSize=" + byteSize +
", size='" + size + '\'' +
'}';
}
1.在原包下New一個新包adapter
2.在adapter下New一個Java Class -- MyAdapter
public class MyAdapter extends BaseAdapter {
List<AppInfo> list;
LayoutInflater inflater;
public MyAdapter(Context context) {
this.inflater = LayoutInflater.from(context);
}
public void setList(List<AppInfo> list) {
this.list = list;
}
@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(final int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if(convertView == null) {
convertView = inflater.inflate(R.layout.item, null);
holder = new ViewHolder();
holder.logo = (ImageView) convertView.findViewById(R.id.logo);
holder.title = (TextView) convertView.findViewById(R.id.title);
holder.version = (TextView) convertView.findViewById(R.id.version);
holder.size = (TextView) convertView.findViewById(R.id.size);
holder.btn = (Button) convertView.findViewById(R.id.btn);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
AppInfo app = list.get(position); //list得到的每一個項就是實體類物件
holder.logo.setImageDrawable(app.icon);
holder.title.setText(app.appName);
holder.version.setText(app.versionName);
holder.size.setText(app.size + "M");
return convertView;
}
public class ViewHolder{
ImageView logo;
TextView title;
TextView version;
TextView size;
Button btn;
}
}
colors.xml
<resources>
<color name="transparent">#00000000</color>
<color name="choose">#ff0febff</color>
</resources>
drawable -- item_selector.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/transparent" android:state_pressed="false"/>
<item android:drawable="@color/choose" android:state_pressed="true"/>
</selector>
drawable -- btn_selector.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/btn_bg2" android:state_pressed="false"/>
<item android:drawable="@drawable/btn_bg_p" android:state_pressed="true"/>
</selector>
item.xml
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants"
>
<!--行佈局-->
<RelativeLayout
android:id="@+id/box"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginTop="5dp"
android:layout_marginRight="5dp"
android:padding="5dp"
>
<ImageView
android:id="@+id/logo"
android:layout_width="70dp"
android:layout_height="70dp"
android:src="@drawable/icon_music"
android:layout_centerVertical="true"/>
<Button
android:id="@+id/btn"
android:layout_width="66dp"
android:layout_height="30dp"
android:text="解除安裝"
android:textColor="#fff"
android:textSize="14sp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:background="@drawable/btn_selector"
/>
<!--文字說明的部分-->
<LinearLayout
android:id="@+id/textbox"
android:layout_width="match_parent"
android:layout_height="70dp"
android:layout_toRightOf="@id/logo"
android:layout_toLeftOf="@id/btn"
android:orientation="vertical">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="千千靜聽"
android:textSize="16sp"
android:layout_marginTop="3dp"/>
<TextView
android:id="@+id/version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="版本: 1.0"
android:textSize="12sp"
android:textColor="#999"
android:layout_marginTop="6dp"/>
<TextView
android:id="@+id/size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="大小: 18.05M"
android:textSize="12sp"
android:textColor="#999"
android:layout_marginTop="6dp"/>
</LinearLayout>
</RelativeLayout>
</RelativeLayout>
main.xml
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<!--listview的標籤-->
<ListView
android:id="@+id/lv_main"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:listSelector="@drawable/item_selector"
/>
</RelativeLayout>
Java程式碼
public class MainActivity extends Activity {
ListView lv;
List<AppInfo> list;
MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//拿到ListView
lv = (ListView) findViewById(R.id.lv_main);
//資料來源
list = Utils.getAppList(this);
//介面卡
adapter = new MyAdapter(this);
adapter.setList(list);
//關聯
lv.setAdapter(adapter);
Log.i("srq","list="+list.toString());
}
}
改動MyAdapter(測試用)
AppInfo app = list.get(position);
holder.logo.setImageDrawable(app.icon);
holder.title.setText(app.appName);
holder.version.setText(app.versionName + " "+ Utils.getTime(app.insTime));
holder.size.setText(app.size + "M" + " "+Utils.getTime(app.updTime));