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 ...
随机推荐
- Windows通用应用开发手记-Behavior SDK概述
随着Visual Studio 2013的发布,New Behavior SDK也一起出现了.和Expression Blend SDK相似,包括各种内置行为(behavior和action),可以用 ...
- java有符号无符号的转换
数据处理中常常遇到基本数据类型的操作,java都是有符号的数据,而与下位机通信中常常遇到无符号的比如uint8, uint16,uint32等等 1.为了完成这个功能还专门采用ByteBuffer的方 ...
- 关于网络爬虫项目的项目建议(NABCD)
Need 我们小组的研究课题是编写一个更快捷,更安全的爬虫软件,编写时会应用到学长的部分代码并在其基础上完善创新. 初步阅读了学长们的博客上面的几个版本的测试情况和源代码,发现学长们在实现基础功能的条 ...
- java后台开发传输乱码&&接口post传参失败
起因: 前几天遇到的问题,才有时间记录,需求:本地生成xml形式的字符串以参数形式用post方法传送到对方的固定接口: 这个需求写的时候感觉很容易,本地测试的时候,也觉得很简单就过了,然后和对方联调的 ...
- 《理解 ES6》阅读整理:块绑定(Block Binding)
变量声明一直是JavaScript中一个需要技巧的部分.在大多数基于C的编程语言中,变量(更正式地说是绑定)在声明的时候创建,然而在JavaScript中并不是这样.在JavaScript中,变量在何 ...
- SQL Server优化器特性-隐式谓词
我们都知道,一条SQL语句提交给优化器会产生相应的执行计划然后执行输出结果,但他的执行计划是如何产生的呢?这可能是关系型数据库最复杂的部分了.这里我为大家介绍一个有关SQL Server优化器的特性- ...
- 用SQLSERVER里的bcp命令或者bulkinsert命令也可以把dat文件导入数据表
用SQLSERVER里的bcp命令或者bulkinsert命令也可以把dat文件导入数据表 下面的内容的实验环境我是在SQLSERVER2005上面做的 之前在园子里看到两篇文章<C# 读取纯真 ...
- 用c#开发微信 (13) 微统计 - 阅读分享统计系统 3 UI设计及后台处理
微信平台自带的统计功能太简单,有时我们需要统计有哪些微信个人用户阅读.分享了微信公众号的手机网页,以及微信个人用户访问手机网页的来源:朋友圈分享访问.好友分享消息访问等.本系统实现了手机网页阅读. ...
- 深入浅出话VC++(2)——MFC的本质
一.引言 上一专题中,纯手动地完成了一个Windows应用程序,然而,在实际开发中,我们大多数都是使用已有的类库来开发Windows应用程序.MFC(Microsoft Foundation Clas ...
- Sqoop2 环境搭建
原文地址:http://www.cnblogs.com/luogankun/p/4209017.html 正在准备做Spark SQL external data source与关系型数据库交互的部分 ...