Android安卓-开发一个android桌面

从0开始 开发一个属于自己的桌面程序

最近在开发一个新项目,需要把应用改成桌面,并引导用户设置为默认桌面,完成后的效果如下图:

 

1.添加XML

  <activity android:name=".activitys.DeskTop" android:launchMode="singleTop"><intent-filter><category android:name="android.intent.category.HOME" /><category android:name="android.intent.category.DEFAULT" /><action android:name="android.intent.action.MAIN"></action><category android:name="android.intent.category.LAUNCHER"></category></intent-filter></activity>

在主Activity里 添加

<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />

这样用户在点按Home键的时候,就会弹出对话框,提示选择新的默认桌面

2.主Activity布局文件

布局比较简单,线性布局嵌套GridView,下面留了一点空袭是为了腾出空间放置拨号、短信常用APP

<?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"android:id="@+id/desktop_linear"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="2"><GridViewandroid:id="@+id/mgv"android:layout_width="match_parent"android:layout_height="match_parent"android:numColumns="4"></GridView></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="8"></LinearLayout>
</LinearLayout>

3.获取APP列表

获取手机上已经安装的APP列表,同时过滤掉系统应用

public static List<AppInfo> GetAppList1(Context context){List<AppInfo> list=new ArrayList<>();PackageManager pm = context.getPackageManager();Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);List<ResolveInfo> activities   = pm.queryIntentActivities(mainIntent, 0);for(ResolveInfo info : activities){String packName = info.activityInfo.packageName;if(packName.equals(context.getPackageName())){continue;}AppInfo mInfo = new AppInfo();mInfo.setIco(info.activityInfo.applicationInfo.loadIcon(pm));mInfo.setName(info.activityInfo.applicationInfo.loadLabel(pm).toString());mInfo.setPackageName(packName);// 为应用程序的启动Activity 准备IntentIntent launchIntent = new Intent();launchIntent.setComponent(new ComponentName(packName,info.activityInfo.name));mInfo.setIntent(launchIntent);list.add(mInfo);}return list;}

AppInfo的类也放出来

public class AppInfo {private String packageName; //包名private Drawable ico;       //图标private String Name;        //应用标签private Intent intent;     //启动应用程序的Intent ,一般是Action为Main和Category为Lancher的Activitypublic Intent getIntent() {return intent;}public void setIntent(Intent intent) {this.intent = intent;}public String getPackageName() {return packageName;}public void setPackageName(String packageName) {this.packageName = packageName;}public Drawable getIco() {return ico;}public void setIco(Drawable ico) {this.ico = ico;}public String getName() {return Name;}public void setName(String name) {Name = name;}
}

4.自定义BaseAdapter填充GridView数据

public class DeskTopGridViewBaseAdapter extends BaseAdapter {Context context;List<AppInfo> appInfos=new ArrayList<>();public DeskTopGridViewBaseAdapter(List<AppInfo> appInfos,Context context){this.appInfos=appInfos;this.context=context;}@Overridepublic int getCount() {return appInfos.size();}@Overridepublic Object getItem(int position) {return appInfos.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {Holder holder=null;if (convertView==null){convertView = LayoutInflater.from(context).inflate(R.layout.desktop_gridview_item,null);holder=new Holder();holder.ico=(ImageView) convertView.findViewById(R.id.iv);holder.Name=(TextView) convertView.findViewById(R.id.tv);convertView.setTag(holder);}else {holder= (Holder) convertView.getTag();}holder.ico.setImageDrawable(appInfos.get(position).getIco());holder.Name.setText(appInfos.get(position).getName());return convertView;}static class Holder{ImageView ico;TextView Name;}

 R.layout.desktop_gridview_item的布局文件

<?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"android:gravity="center"><ImageViewandroid:layout_margin="5dp"android:id="@+id/iv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:maxHeight="60dp"/><TextViewandroid:layout_margin="5dp"android:id="@+id/tv"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:maxLines="1"android:text="Lable"/>
</LinearLayout>

 

 

5.在主Activity里填充数据,并给GridView的Item设置点击事件,点击图标之后打开该App

 private void initAppList() {appInfos=GetApps.GetAppList1(this);DeskTopGridViewBaseAdapter deskTopGridViewBaseAdapter=new DeskTopGridViewBaseAdapter(appInfos,this);mGridView.setAdapter(deskTopGridViewBaseAdapter);mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//                Intent intent=appInfos.get(position).getIntent();
//                startActivity(intent);Intent intent = getPackageManager().getLaunchIntentForPackage(appInfos.get(position).getPackageName());if (intent != null) {intent.putExtra("type", "110");intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);}}});}

到这里基本就打工搞成了,我们继续设置一下主Activity的背景为当前用户的桌面壁纸

 //设置背景WallpaperManager manager =WallpaperManager.getInstance(this);Drawable drawable=manager.getDrawable();linearLayout.setBackground(drawable);

这里需要注意,需要动态申请这两个权限,注意 是动态申请

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

继续,弹出对话框,让用户设置为默认桌面,这里针对小米、华为、普通安卓都有处理,我直接把代码贴出来

//桌面相关操作public class Desktop {private Context context;public Desktop(Context context) {this.context = context;}/*** 清除默认桌面(采用先设置一个空的桌面为默认然后在将该空桌面禁用的方式来实现)**/@SuppressLint("WrongConstant")public void clearDefaultLauncher() {PackageManager pm = context.getPackageManager();String pn = context.getPackageName();String hn = MockHome.class.getName();ComponentName mhCN = new ComponentName(pn, hn);Intent homeIntent = new Intent("android.intent.action.MAIN");homeIntent.addCategory("android.intent.category.HOME");homeIntent.addCategory("android.intent.category.DEFAULT");homeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);pm.setComponentEnabledSetting(mhCN, 1, 1);context.startActivity(homeIntent);pm.setComponentEnabledSetting(mhCN, 0, 1);}//弹出选择默认桌面public void SetDefaultLauncher(){try {Intent  paramIntent = new Intent("android.intent.action.MAIN");paramIntent.setComponent(new ComponentName("android", "com.android.internal.app.ResolverActivity"));paramIntent.addCategory("android.intent.category.DEFAULT");paramIntent.addCategory("android.intent.category.HOME");context.startActivity(paramIntent);}catch (Exception e){e.printStackTrace();}try {Intent  paramIntent1 = new Intent("android.intent.action.MAIN");paramIntent1.setComponent(new ComponentName("com.huawei.android.internal.app", "com.huawei.android.internal.app.HwResolverActivity"));paramIntent1.addCategory("android.intent.category.DEFAULT");paramIntent1.addCategory("android.intent.category.HOME");context.startActivity(paramIntent1);}catch (Exception e){e.printStackTrace();startHuaweiSettingActOfDefLauncher();}}//打开华为设置页面,让用户选择默认桌面public void startHuaweiSettingActOfDefLauncher() {IntentFilter localIntentFilter = new IntentFilter();localIntentFilter.addAction(Intent.ACTION_MAIN);//"android.intent.action.MAIN"localIntentFilter.addCategory(Intent.CATEGORY_HOME);//"android.intent.category.HOME"Intent localIntent3 = new Intent(localIntentFilter.getAction(0));localIntent3.addCategory(localIntentFilter.getCategory(0));Intent localIntent4 = new Intent();localIntent4.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);localIntent4.setClassName("com.android.settings", "com.android.settings.Settings$PreferredSettingsActivity");localIntent4.putExtra("preferred_app_package_name", context.getPackageName());localIntent4.putExtra("preferred_app_class_name", context.getClass().getName());localIntent4.putExtra("is_user_confirmed", true);localIntent4.putExtra("preferred_app_intent", localIntent3);localIntent4.putExtra("preferred_app_intent_filter", localIntentFilter);localIntent4.putExtra("preferred_app_label", "默认桌面设置");context.startActivity(localIntent4);}//获取当前默认桌面,如果不是本App则弹出设置默认桌面对话框public void getDefaultHome() {final Intent intent = new Intent(Intent.ACTION_MAIN);intent.addCategory(Intent.CATEGORY_HOME);final ResolveInfo res = context.getPackageManager().resolveActivity(intent, 0);if (res.activityInfo == null) {//获取失败} else if (res.activityInfo.packageName.equals("android")) {// No default selectedclearDefaultLauncher();SetDefaultLauncher();} else {if (!res.activityInfo.packageName.equals("net.xiaomy.dxsjb.client")){clearDefaultLauncher();SetDefaultLauncher();}}}
}

这里注意:清除默认桌面,需要一个空的Activity,这里贴上xml文件代码,再自行添加一个Activity类就好

 <activity android:name=".activitys.MockHome" android:enabled="false"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.HOME" /></intent-filter></activity>

 

我这里在主Activity里调用:

 //设置默认桌面Desktop desktop=new Desktop(this);desktop.getDefaultHome();

好了,到这里就算完成了,欢迎留言评论交流,转载请注明出处!

 

自己新开发的免费内网穿透项目小蚂蚁内网穿透,支持HTTP、TCP全端口映射,戳我进内网穿透官网www.xiaomy.net!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/40332.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓11客制需求:<MtkSettings:添加桌面设置,并且能够正常切换桌面APK>

需要修改的路径代码路径&#xff1a;vendor/mediatek/proprietary/packages/apps/MtkSettings/AndroidManifest.xml <!-- 注册一个activity&#xff0c;用于启动 com.android.internal.app.ResolverActivity --><!-- gyh add --><activity android:name".S…

还在用手记录会议笔记?录音转文字简单的方法介绍

相信很多小伙伴们的单位或者是公司每周都要开会&#xff0c;开会一般都要写会议记录存档&#xff0c;有很多朋友这个时候在会议上拼命的记&#xff0c;但是对于一些打字慢的或是写字慢的人来说怎么办呢&#xff1f;这样就会跟不上&#xff0c;其实有更搞笑的方法&#xff0c;首…

只需一键录音转文字,会议记录让你不在烦恼

来让我看看还有哪位朋友&#xff0c;还在傻傻一遍遍听会议录音&#xff0c;手写会议纪要呀&#xff1f; 都2022年了&#xff0c;你不会还不知道这款只需一键就能语音转文字的APP吧&#xff01; 90后打工人&#xff0c;今天给大家分享个职场必备软件&#xff0c;让你瞬间效率拉…

3、微信小程序-通信

文章目录 前言一、组件通信1.微信小程序组件内部&#xff08;页面与逻辑层之间&#xff09;通信2.微信小程序组件之间&#xff08;父子组件&#xff09;通信&#xff08;1&#xff09;父组件是如何向子组件传递数据的&#xff08;2&#xff09;子组件是如何向父组件传递数据的 …

微信小程序之页面通信方式

文章目录 一、前言二、页面通信是什么&#xff1f;三、传值的几种常用方式1.页面跳转传参2.页面跳转传入数据3.使用全局变量传递数据4.利用缓存进行传值 四、小结 一、前言 提示&#xff1a;微信小程序中&#xff0c;页面间的通信方式很重要&#xff0c;通信方式也有很多种&am…

【最新版全插件】多功能同城优选小程序源码

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 1.为本地的线下商家提供线上销售渠道。一直以来本地商品、娱乐、休闲、旅游服务线上购买大家都是以美团为准。近几年来随着微信公众号、小程序的渗透力逐渐加强&#xff0c;越来越多的…

微信公众号开发之绑定微信开发者

第一步&#xff1a;登录微信公众号&#xff0c;绑定网页开发者 在登录后的界面中&#xff0c;我们向下拉在左侧会看到有一个“开发者工具”点击。 这时在开发者工具中&#xff0c;会看到有好几个工具&#xff0c;其中有一个“web开发者工具”&#xff0c;我们点击进入。 在这里…

微信公众号登录授权(全网发布)一键绑定公众号设置

微信公众号登录授权&#xff08;全网发布&#xff09;一键绑定公众号设置教程及常见问题 前言&#xff1a;本操作跟服务器配置&#xff0c;网络环境等综合环境有关&#xff08;95%&#xff09;&#xff0c;另外存在5%的运气和人品。WeiDogs官方确保程序此功能正常并提供设置教程…

python微信公众号微信用户绑定第三方网站

场景 例如,某用户在第三方购物平台的账号(user_id/手机号码等)需要跟该用户的微信账号进行绑定, 实现在该购物平台的微信公众号中查询个人信息, 消费记录, 充值记录等操作.总的来说便是,将微信用户的open_id跟第三方网址user_id/手机号码等进行一对一关联 实现方案 微信用户…

微信公众号开发—通过网页授权实现业务系统登录及用户绑定(微信网页授权自动登录业务系统)

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; 微信公众号开发—通过网页授权实现业务系统登录及用户绑定(微信网页授权…

微信授权登录流程以及公众号配置方法(golang后端)

一、准备一个已经认证OK的微信公众号和已经备案的域名&#xff0c;且解析好配置好https证书。 1.如上图 微信公众号 > 基本配置 &#xff0c;设置开发者密码 2.设置IP白名单&#xff0c;白名单填写提供后端服务的服务器公网IP 二、公众号服务器配置。 1.找到基本配置 2.将服…

微信公众号用户与网站用户的绑定方案

现在很多网站都已经建立了一套完整的用户账号体系&#xff0c;基于这套体系&#xff0c;再做其他应用的用户扩展就非常方便。例如&#xff0c;有了微软的outlook账户&#xff0c;就可以登录win8&#xff0c;可以登录微软的邮箱&#xff0c;还可以登录skype。同样地&#xff0c;…

微信开放平台 帐号管理 绑定在同一个开放平台帐号下的公众号及小程序让用户unionid一致...

开发十年&#xff0c;就只剩下这套架构体系了&#xff01; >>> 第三方平台在获得此权限后&#xff0c;可以代替已授权的公众号/小程序创建开放平台帐号或进行绑定/解绑操作。 绑定在同一个开放平台帐号下的公众号及小程序&#xff0c;用户unionid一致。开发者可调用…

wechat-0051,微信公众号,第三方登录—扫码绑定

声明&#xff1a;这边所谓的第三方登录&#xff0c;不是通过网页授权的方式&#xff0c;而是利用生成带参数的二维码&#xff0c;将微信号和平台账号绑定实现。如果你要做的是授权登录&#xff0c;请查看 https://blog.csdn.net/wrongyao/article/details/80229986 微信第三方…

IT创业项目 - 跟淘宝商城合作网赚项目,赚多少你说了算!

【项目介绍】&#xff1a; 使用淘宝商城的巨大流量销售产品或者服务。 【市场前景】&#xff1a; 淘宝网作为最大的B2C交易平台,淘宝商城又是淘宝网要点的发展对象&#xff0c;越来越多的年轻人喜爱在淘宝购买产品和服务。使用好淘宝的流量&#xff0c;赚钱十分简略。其实这是一…

微信公众号开发消息推送以及图文推送

今天给大家分享的关注公众号自动推送图文消息&#xff0c;以及做一个超牛逼的机器人。 先看看效果。 发错图了。。。这是我昨天开发的一款机器人chu了会骂人啥都不会了。我今天将它词库进行了更新和升级&#xff0c;接入了http://www.itpk.cn/ 机器人第三词库 先给你截图&…

【全网最简单】给朋友- 制作,微信公众号推送教程

简介&#xff1a; 前段时间&#xff0c;抖音非常火的微信公众号推送天气&#xff0c;生日&#xff0c;祝福等信息给女朋友专属推送&#xff0c;而且大部分都是Python写的&#xff0c;对于我来说&#xff0c;必须得整起&#xff0c;上java版本&#xff0c;到时候打个包&#xff…

小扎All in AIGC,连夜成立顶级产品团队

金磊 发自 凹非寺量子位 | 公众号 QbitAI ChatGPT的火爆&#xff0c;终究是让Meta坐不住了。 这不&#xff0c;小扎&#xff08;扎克伯格&#xff09;连夜对外宣布了公司的大动作&#xff1a; 成立顶级产品团队&#xff0c;专注AIGC。 这个团队可以说是整合了全公司搞AIGC的人才…

MySQL 被 PG 干翻!最赚钱的开发语言是他?

出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013) Stack Overflow 发布了 2023 年开发者调查报告&#xff0c;据称共计超过 9 万名开发者参与了此次调查。 完整报告包含了受访开发者画像&#xff0c;以及关于开发技术、AI、职业、社区等方面的内容。本文主要介绍关于…

文心一言员工跳槽工资翻倍,猎头:百万年薪很正常

整理 | 朱珂欣 出品 | CSDN程序人生&#xff08;ID&#xff1a;coder_life&#xff09; 前段时间&#xff0c;国内外科技圈呈现出群雄逐“ChatGPT”的态势&#xff1a;谷歌官宣竞品 Bard 、微软发布 AI 驱动的新版 Bing 搜索引擎和 Edge 浏览器、百度官宣“文心一言”、网易…