一个获取手机应用并且按照安装的最新更新时间排序的demo

本文介绍了一种在Android设备上获取所有已安装应用信息的方法,并实现了按更新时间排序的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先上效果图


核心代码:

package com.xiaoya.getAppsInfo;

import android.content.pm.*;
import android.graphics.drawable.*;
import android.os.*;
import android.support.v7.app.*;
import android.widget.*;

import java.util.*;

public class MainActivity extends AppCompatActivity {

    private AppInfoAdapter mAdapter;
    private List<AppInfo> mAppInfos = null;
    private ListView mAppsListView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mAppsListView = ( ListView ) findViewById(R.id.mlist);

    }

    @Override
    protected void onResume() {
        super.onResume();
        getApps();
        sortData(( ArrayList<AppInfo> ) mAppInfos);
        updateUI(mAppInfos);

    }

    /**
     * 更新UI;
     *
     * @param appInfos
     */
    public void updateUI(List<AppInfo> appInfos) {
        if (null != appInfos) {
            mAdapter = new AppInfoAdapter(getApplication(), appInfos);
            mAppsListView.setAdapter(mAdapter);
        }
    }

    /**
     * 获取手机安装的应用信息;
     */
    private void getApps() {

        mAppInfos = new ArrayList<>();
        PackageManager pm = getApplication().getPackageManager();
        List<PackageInfo> packageInfos = pm.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);
        /* 获取应用程序的名称,不是包名,而是清单文件中的labelname
            String str_name = packageInfo.applicationInfo.loadLabel(pm).toString();
            appInfo.setAppName(str_name);
         */

        for (PackageInfo packageInfo : packageInfos) {
            String appName = packageInfo.applicationInfo.loadLabel(pm).toString();
            String versionName = packageInfo.versionName;
            Drawable drawable = packageInfo.applicationInfo.loadIcon(pm);
            long lastUpdateTime = packageInfo.lastUpdateTime;
            AppInfo appInfo = new AppInfo(appName, versionName, drawable,lastUpdateTime);
            mAppInfos.add(appInfo);
        }


    }

    /**
     * 按照时间排序;
     * @param mList
     */
    private void sortData(ArrayList<AppInfo> mList) {
        Collections.sort(mList, new Comparator<AppInfo>() {
            /**
             *
             * @param lhs
             * @param rhs
             * @return an integer < 0 if lhs is less than rhs, 0 if they are
             *         equal, and > 0 if lhs is greater than rhs,比较数据大小时,这里比的是时间
             */
            @Override
            public int compare(AppInfo lhs, AppInfo rhs) {
                long date1 = lhs.getUpdateTime();
                long date2 = rhs.getUpdateTime();
                // 对时间字段进行降序
                if (date1 < date2) {
                    return 1;
                }
                return -1;
            }
        });

    }
}

其次是adapter文件AppInfoAdapter.java和布局文件item_apps.xml和activity_main.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="60dp"
                android:gravity="center_vertical">

    <ImageView
        android:id="@+id/item_app_img"
        android:layout_width="55dp"
        android:layout_height="55dp"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:layout_marginLeft="15dp"
        android:src="@mipmap/ic_launcher"
        android:scaleType="center"
        />

    <TextView
        android:id="@+id/item_app_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="10dp"
        android:layout_toRightOf="@id/item_app_img"
        android:text="应用名称"
        android:textSize="14sp"/>

    <TextView
        android:id="@+id/item_app_version"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@id/item_app_name"
        android:layout_below="@id/item_app_name"
        android:layout_marginTop="8dp"
        android:text="应用版本"
        android:textSize="14sp"/>

    <TextView
        android:id="@+id/item_app_update_time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="15dp"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:textSize="12sp"
        android:text="更新时间"
        android:visibility="gone"/>
    <View
        android:layout_width="match_parent"
        android:layout_height="0.5dp"
        android:layout_alignParentBottom="true"
        android:background="#ccc"/>
</RelativeLayout>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">


    <TextView
        android:id="@+id/txt_title"
        android:layout_width="match_parent"
        android:layout_height="48dp"
       android:gravity="center"
        android:text="应用列表"
        android:textColor="#333"
        android:textSize="18sp"
        />
    <View
        android:id="@+id/line"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#DADDE3"/>


    <ListView
        android:id="@+id/mlist"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="@null"
        android:dividerHeight="0dp"
        />

</LinearLayout>

package com.xiaoya.getAppsInfo;

import android.content.*;
import android.view.*;
import android.widget.*;

import java.util.*;

/**
 * <pre>
 *     author : xiaoya
 *     time   : 2018/03/03
 *     desc   列表的适配器
 *     version: 1.0
 * </pre>
 */

public class AppInfoAdapter extends BaseAdapter {

    private Context mContext;
    private List<AppInfo> mList = new ArrayList<>();

    public AppInfoAdapter(Context context, List list) {

        this.mContext = context;
        this.mList = list;
    }

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

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {


        MyViewHolder holder = null;
        AppInfo item_apps = mList.get(position);
        if (null == convertView) {
            convertView = View.inflate(mContext, R.layout.item_apps, null);
            holder = new MyViewHolder();
            holder.item_app_img = ( ImageView ) convertView.findViewById(R.id.item_app_img);
            holder.item_app_name = ( TextView ) convertView.findViewById(R.id.item_app_name);
            holder.item_app_version = ( TextView ) convertView.findViewById(R.id.item_app_version);
            holder.item_app_updatetime=(TextView )convertView.findViewById(R.id.item_app_update_time);
            convertView.setTag(holder);
        } else {
            holder = ( MyViewHolder ) convertView.getTag();
        }
        holder.item_app_img.setImageDrawable(item_apps.getDrawable());
        //只有图片上传失败并且已经上传完成时 显示上传失败提示;
        holder.item_app_name.setText(item_apps.getAppName());
        holder.item_app_version.setText(item_apps.getAppVersion());
        holder.item_app_updatetime.setText(item_apps.getUpdateTime()+"");

        return convertView;
    }

    public class MyViewHolder {
        ImageView item_app_img;
        TextView item_app_name;
        TextView item_app_version;
        TextView item_app_updatetime;


    }
}

实体类AppInfo.java

package com.xiaoya.getAppsInfo;

import android.graphics.drawable.*;

/**
 * <pre>
 *     author : xiaoya
 *     time   : 2018/03/03
 *     desc   :应用信息封装类
 *     version: 1.0
 * </pre>
 */

public class AppInfo {

    private String appName;
    private String appVersion;
    private Drawable drawable;
    private long updateTime;


    public AppInfo() {
    }

    public AppInfo(String appName) {
        this.appName = appName;
    }

    public AppInfo(String appName, String appVersion) {
        this.appName = appName;
        this.appVersion = appVersion;
    }

    public AppInfo(String appName, String appVersion, Drawable drawable) {
        this.appName = appName;
        this.appVersion = appVersion;
        this.drawable = drawable;
    }

    public AppInfo(String appName, String appVersion, Drawable drawable, long updateTime) {
        this.appName = appName;
        this.appVersion = appVersion;
        this.drawable = drawable;
        this.updateTime = updateTime;
    }

    public String getAppName() {
        return appName;
    }

    public void setAppName(String appName) {
        this.appName = appName;
    }

    public String getAppVersion() {
        return appVersion;
    }

    public void setAppVersion(String appVersion) {
        this.appVersion = appVersion;
    }

    public Drawable getDrawable() {
        return drawable;
    }

    public void setDrawable(Drawable drawable) {
        this.drawable = drawable;
    }

    public long getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(long updateTime) {
        this.updateTime = updateTime;
    }
}

如有更好的方式实现欢迎提出来,有不对的地方欢迎指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值