android实现qq邮箱多个图标效果
前几天,蛋疼的技术主管非要实现类似装一个qq邮箱,然后能够使用qq邮箱日历的那么一个东西。相当于一个应用生成两个图标,可是不同的是点击不同的图标能够进入不同的应用,例如以下图的效果。
这效果百度了一天也不知道怎样着手,仅仅能自己搞。分享一下自己解决问题的过程。大概是这种
1.首先分析来说整个桌面luncher是一个activity,全部的图标都是一个button而已,点击图标就是点击一个button然后去运行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 shortcut
final 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);
}
}
这里事实上都非常easy,就是加入一个flag,这个flag作用非常大。细致讲一下
FLAG_ACTIVITY_NEW_TASK设置此状态,首先会查找是否存在和被启动的Activity具有同样的亲和性的任务栈(即taskAffinity)假设有直接把这
个栈总体移动到前台,并保持栈中的状态不变。即栈中的activity顺序不变,假设没有。则新建一个栈来存放被启动的activity.
这就是为什么我们点击home键之后然后再点击图标会恢复到原来的状态,而不是又一次去创建一个activity。
通过以上的分析大概能实现这种东西了,如今我仅仅须要让他们执行在不同的任务栈里面就可以。相互之间不可以影响。以下是大概实现的流程,仅供參考,由于这个仅仅是基础的模型而已。实际上我们在里面加了非常多业务。
大概的思路就这样一下是代码的实现。
主要是放入了一个字段叫做class然后点击图标的时候获取这个字段。打开对应的activity就可以
public class BootupActivity extends Activity { private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what)
{
case 1: break;
}
}
};
@Override
protected 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 rebuilding
shortcut.putExtra("duplicate", false);
// shortcut.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
// setting name
shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, lable);
// setting icon
if (iconRes!=0) {
shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
Intent.ShortcutIconResource.fromContext(this, iconRes));
} // create a broadcast intent
Intent intent = new Intent(this, bootupClass);
intent.putExtra("Class", destClassName);
intent.setAction(Intent.ACTION_MAIN); // setting intent
shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent); // send broadcast
sendBroadcast(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而且和基本的同样。
<application
android:icon="@drawable/ic_launcher" android:name="com.zlh.combined.MainApp"
android:taskAffinity="com.p">
<activity
android: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>
<activity
android:name=".Activity1"
android:taskAffinity="com.p"
android:process=":proxy2"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" /> </intent-filter>
</activity>
<activity
android: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邮箱多个图标效果的更多相关文章
- 使用plupload做一个类似qq邮箱附件上传的效果
公司项目中使用的框架是springmvc+hibernate+spring,目前需要做一个类似qq邮箱附件上传的功能,暂时只是上传小类型的附件 处理过程和解决方案都需要添加附件,处理过程和解决方案都可 ...
- 用jquery实现的QQ邮箱里的多收件人选取及其他效果改进版
我们先来看一下之前网上的版本效果: 发现很多bug且应用场景不一样,没办法只能自己写了 操作时 textarea 的值只是显示效果,实现的参数为 hidden 2017-04-25再次改进版与新版的 ...
- Android实现电子邮箱客户端
本文主要讲述了安卓平台上利用QQ邮箱SMTP协议,POP3协议发送与接收消息的实现 发送邮件核心代码 import java.security.Security; import java.util.D ...
- 如何变相的绕过QQ邮箱订阅的繁琐核审
先看看正常流程:http://open.mail.qq.com/ 点击“接入订阅”==>申请接入==>登录一下 选择接入完全免费 大概流程就是这样: 下面我们说说快速接入的方法: 1.登录 ...
- 全面盘点当前Android后台保活方案的真实运行效果(截止2019年前)
本文原作者“minminaya”,作者网站:minminaya.cn,为了提升文章品质,即时通讯网对内容作了幅修订和改动,感谢原作者. 1.引言 对于IM应用和消息推送服务的开发者来说,在Androi ...
- QQ邮箱无限扩容 + XMind8 Update8 Crack 小记
QQ邮箱扩容 三个月后还可以扩容 XMind8 Update8 Crack 软件地址 软件下载地址:https://www.xmind.cn/download/xmind8 补丁地址 破解补丁下载地址 ...
- 【腾讯敏捷转型No.7】QQ邮箱如何通过敏捷成为行业第一
前几篇文章讲到2006年的腾讯是如何开始敏捷转型的,接下来这篇文章,我将向大家讲述,腾讯开始敏捷转型之后,QQ邮箱是如何通过敏捷成为行业第一. 众所周知,张小龙是“微信之父”,对他熟悉的人,应该也知道 ...
- 《推送开发全面盘点当前Android后台保活方案的真实运行效果》
登录 立即注册 TCP/IP详解 资讯 动态 社区 技术精选 首页 即时通讯网›专项技术区›推送开发全面盘点当前Android后台保活方案的真实运行效果(截止2 ... 帖子 打赏 分 ...
- Email系列(QQ邮箱 + 含附件的邮箱案例 + 项目实战)
平台之大势何人能挡? 带着你的Net飞奔吧! http://www.cnblogs.com/dunitian/p/4822808.html 邮箱系列:https://github.com/duniti ...
随机推荐
- 【Map】MapTest
package cn.itcast.p1.map.test; import java.util.HashMap; import java.util.Map; public class MapTest2 ...
- c# 抓取Web网页数据分析
通过程序自动的读取其它网站网页显示的信息,类似于爬虫程序.比方说我们有一个系统,要提取BaiDu网站上歌曲搜索排名.分析系统在根据得到的数据进行数据分析.为业务提供参考数据. 为了完成以上的需求,我们 ...
- 数论(poj 1401)
题目:Factorial 题意:求N!末尾的0 的数量. 思路:10 = 2 * 5:N!中的2 的数量肯定比 5多:只需寻找5 的数量,暴力寻找TLE: 快点的方法:f(N) = N/5 + f( ...
- hdu 1003
Max Sum Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u Submit Statu ...
- IOS-synthesize和dynamic的异同(转)
一,retain, copy, assign区别 1. 假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b.此时a ...
- kettle etl
使用注意点 1 如果服务器资源有限的话,尽量少开任务窗口,但是要有容错机制,可以分为按天按分钟 2 如果不想写较长的sql可以用detail来启动 3 在设置每天提交的条数时,如果数据很少,而设置值很 ...
- 在CS代码页获取input输入框内肉----.net学习点滴
想在后台cs页面得到前台页面aspx中html控件input输入的值.通过访问input输入框的name属性值获取. 解决方法如下: 1.用Request["user"].toSt ...
- QSS总结以及最近做的Qt项目
什么是QSS QSS称为Qt Style Sheets也就是Qt样式表,它是Qt提供的一种用来自定义控件外观的机制.QSS大量参考了CSS的内容,只不过QSS的功能比CSS要弱很多,体现在选择器要少, ...
- 基于阿里云容器服务用docker容器运行ASP.NET 5示例程序
小试阿里云容器服务 之后,接下来有一个挡不住的小试冲动--用docker容器运行程序.首先想到的程序是 ASP.NET 5示例程序,于是参考msdn博客中的这篇博文 Running ASP.NET 5 ...
- [自制简单操作系统] 7、多任务(二)——任务管理自动化&任务休眠
前言 >_<" 这里仿照窗口管理的方式将任务管理也修改成相应的管理模式,这样可以灵活的添加多个任务,而不必每次都要修改任务切换函数:此外还在任务休眠做了尝试,通过将任务挂起和唤醒 ...