前几天,蛋疼的技术主管非要实现类似装一个qq邮箱,然后可以使用qq邮箱日历的那么一个东西,相当于一个应用生成两个图标,但是不同的是点击不同的图标可以进入不同的应用,如下图的效果。

这效果百度了一天也不知道如何着手,只能自己搞,分享一下自己解决这个问题的过程,大概是这样的

1.首先分析来说整个桌面luncher是一个activity,所有的图标都是一个按钮而已,点击图标就是点击一个按钮然后去执行activity

2.查看launcher framework层的源代码,https://android.googlesource.com/platform/packages/apps/Launcher/+/master/src/com/android/launcher/Launcher.java  路径是这个,查看可通过翻墙。这类其实和咱自己写的类也没啥区别.  因为Launcher是继承了activity的

public final class Launcher extends Activity implements View.OnClickListener, OnLongClickListener

其次我们只需要找到click事件就行,在这里他会判断被点击view是文件夹还是应用程序,

public void onClick(View v) {Object tag = v.getTag();if (tag instanceof ApplicationInfo) {// Open shortcutfinal Intent intent = ((ApplicationInfo) tag).intent;startActivitySafely(intent);} else if (tag instanceof FolderInfo) {handleFolderClick((FolderInfo) tag);}}

接下来看看startActivitySafely,其实在这里就是处理了下异常和添加一些个flag,但是flag是重点。解析来会继续说flag

    void startActivitySafely(Intent intent) {intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);try {startActivity(intent);} catch (ActivityNotFoundException e) {Toast.makeText(this, R.string.activity_not_found, Toast.LENGTH_SHORT).show();} catch (SecurityException e) {Toast.makeText(this, R.string.activity_not_found, Toast.LENGTH_SHORT).show();e(LOG_TAG, "Launcher does not have the permission to launch " + intent +". Make sure to create a MAIN intent-filter for the corresponding activity " +"or use the exported attribute for this activity.", e);}}

这里其实都很简单,就是添加一个flag,这个flag作用很大,仔细讲一下

FLAG_ACTIVITY_NEW_TASK设置此状态,首先会查找是否存在和被启动的Activity具有相同的亲和性的任务栈(即taskAffinity)如果有直接把这

个栈整体移动到前台,并保持栈中的状态不变,即栈中的activity顺序不变,如果没有,则新建一个栈来存放被启动的activity. 这就是为什么我们点击home键之后然后再点击图标会恢复到原来的状态,而不是重新去创建一个activity。

通过以上的分析大概能实现这样的东西了,现在我只需要让他们运行在不同的任务栈里面即可,相互之间不能够影响。下面是大概实现的流程,仅供参考,因为这个只是基础的模型而已。实际上我们在里面加了很多业务。

大概的思路就这样一下是代码的实现。主要是放入了一个字段叫做class然后点击图标的时候获取这个字段,打开相应的activity即可

public class BootupActivity extends Activity {private Handler handler  = new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what){case 1:break;}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.i("BootupActivity", "OnCreate");String className = getIntent().getStringExtra("Class");if (className==null) {addShortcutToDesktop(BootupActivity.this.getString(R.string.shopping_app_name), R.drawable.shopping_ic_launcher,Activity1.class.getName(), Activity1.class);addShortcutToDesktop(BootupActivity.this.getString(R.string.xiaohua_app_name), R.drawable.xiaohua_ic_launcher,Activity2.class.getName(), Activity2.class);startAppProcess(Activity1.class.getName());} else {startAppProcess(className);}}private void addShortcutToDesktop(String lable, int iconRes, String destClassName, Class<?> bootupClass) {Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");// no rebuildingshortcut.putExtra("duplicate", false);// shortcut.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);// setting nameshortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, lable);// setting iconif (iconRes!=0) {shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,Intent.ShortcutIconResource.fromContext(this, iconRes));}// create a broadcast intentIntent intent = new Intent(this, bootupClass);intent.putExtra("Class", destClassName);intent.setAction(Intent.ACTION_MAIN);// setting intentshortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);// send broadcastsendBroadcast(shortcut);}private void startAppProcess(String bootupClass) {ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);Intent i = new Intent();i.setComponent(new ComponentName(this.getPackageName(), bootupClass));i.putExtra("class", bootupClass);this.startActivity(i);}}

以下是需要在配置文件里面配置的,需要注意到得时android:taskAffinity这个属性,不同的activity需要配置不同的。把主要的activity和默认打开的activity的亲和性配置成一样得。保证点击桌面图标和应用图标能够打开相同的任务栈。然后注意把主要的BootupActivity放在第一个位置。其他得都需要加上一个action并且和主要的相同。

<applicationandroid:icon="@drawable/ic_launcher"android:name="com.zlh.combined.MainApp"android:taskAffinity="com.p"><activityandroid:name=".BootupActivity"android:logo="@drawable/ic_action_search"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activityandroid:name=".Activity1"android:taskAffinity="com.p"android:process=":proxy2"><intent-filter><action android:name="android.intent.action.MAIN" /></intent-filter></activity><activityandroid:name=".Activity2"android:taskAffinity="com.c"android:process=":proxy3"><intent-filter><action android:name="android.intent.action.MAIN" /></intent-filter></activity></application><!-- 创建桌面快捷方式 --><uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />

android实现qq邮箱多个图标效果相关推荐

  1. Android仿qq邮箱账号邮件账号输入框交互

    Android自定义ViewGroup仿qq邮箱发件人.收件人输入交互 直接上图看效果 如何使用看我的Github

  2. Android 仿QQ 聊天消息拖拽效果

    可拖拽的气泡效果 自定义view WateView public class WateView extends FrameLayout {//定义一个文本控件private TextView text ...

  3. Android 仿QQ语音录制 竖线波纹效果

    源码如下: https://github.com/xf420811/audiorecord 效果图

  4. android email分析,QQ邮箱Android客户端产品体验报告

    QQ邮箱Android客户端产品体验报告 概览 手机:魅族MX3 操作系统:Flyme OS 3.5.2(A19220) 体验产品:QQ邮箱Android客户端 软件版本:4.0 需求分析 目标人群: ...

  5. Android iOS Mac QQ邮箱 日历同步

    QQ邮箱 先要开启授权码,这就要求你先绑定一个手机,具体设置请看官方教程. Android & iOS 设置好后,先获得一个授权码,进入QQ邮箱: 设置->账户->POP3/IMA ...

  6. Android开发学习之仿手机QQ消息列表侧滑删除效果

    今天想和大家分享的是手机QQ消息列表侧滑删除效果,这种效果在IOS中被封装为一个列表控件,而手机QQ则是将这个功能移植到了Android上,换言之,这并非是手机QQ的独创.尽管如此,用户体验依然得到了 ...

  7. android 仿QQ音乐歌单效果

    最新的项目里面,有一个需求比较好玩,就是要仿造下QQ音乐里面的歌单上下切换效果,如下 先做一个类似的效果,测试效果如下: 而为了快速开发,不花时间在制造轮子上面,我选用是的zhy大神的一个自定义lay ...

  8. android mail发送邮件(包含163邮箱及qq邮箱,使用mail.jar,activation.jar,additionnal.jar)

    最近项目里有个发邮件的功能,不能调系统发邮件,也不能调用第三方的客户端,还必须可以发网易163邮箱,也可以发QQ邮箱.这让我想起来,当年初学java时自己写了个发送邮件的小demo,就是发给网易邮箱的 ...

  9. Android模仿QQ的左右滑动切换界面和下拉更新的效果

    转自http://www.linuxidc.com/Linux/2012-08/67207.htm 主布局main.xml <?xml version="1.0" encod ...

  10. android 仿qq好友动态,Android UI仿QQ好友列表分组悬浮效果

    本文实例为大家分享了Android UI仿QQ好友列表分组悬浮效果的具体代码,供大家参考,具体内容如下 楼主是在平板上測试的.图片略微有点大,大家看看效果就好 接下来贴源代码: PinnedHeade ...

最新文章

  1. C语言中的位运算和逻辑运算
  2. python 魔法参数*argv 和 **kw
  3. c语言程序的命令行输入,C程序获取命令行参数
  4. python设计一个函数定义计算并返回n价调和函数_音乐编程语言musicpy教程(第三期) musicpy的基础语法(二)...
  5. oracle成本模块培训,Oracle App 培训笔记(5) -- 成本管理模块表结构整理 续
  6. Android中使用Ant编译打包
  7. 视频+案例,玩转LightGBM
  8. 阿里云服务器ECS Ubuntu18.04 首次使用配置教程(图形界面安装)
  9. Batch, Iteration,Epoch概念理解
  10. 大数据实战:如何实时采集上亿级别数据?
  11. leetcode第12题Python版整数转罗马字符串
  12. 电池测试系统连接服务器失败,服务器报电池故障
  13. 组态王日月年报脚本详解
  14. matlab解方java_matlab解方程
  15. 乒乓球侧旋球MATLAB,浅说细谈乒乓球力学(一)
  16. 北京将超前布局6G未来网络!这场发布会,信息量很大
  17. 如何在win7下装ubuntu(硬盘版安装)
  18. 2007年全国硕士研究生入学统一考试(英语一)
  19. H5学习之路之audio音频播放
  20. Centos8安装Python3

热门文章

  1. 数据分析-kaggle泰坦尼克号生存率分析
  2. U8如何月结及反结账
  3. ireport 使用list数据源
  4. # Day15-Java基础
  5. gradle 离线模式offline 用法
  6. 实习生如何在平淡无奇的工作中凸显自我价值?
  7. OSChina 周二乱弹 —— 小哥哥,你可以教我写代码吗
  8. 计算机上机考试自我检查800字,【考试太差 自我反省检讨书800字】_考试成绩差自我反省检讨书范文3篇...
  9. 局域网传文件_iPhone与安卓跨系统「隔空投送」,传大文件超好用
  10. 应用特征值矩阵对角方法