fragment 使用过程中单例模式引发的问题
2014-05-27 14:42
465 查看
fragment 使用过程中单例模式引发的问题
在实际项目开发中,遇到一个这样的问题。
activity结构如下实际需要实现功能为:在收到一个网络推送的消息后,发出一个notification,在通知栏出现,点击该通知,跳转到Fragment2中。
按照理论上来讲直接设置PendingIntent,在PendingIntent中设置跳转目标为Tab2这样就可以直接跳转过来了,但是跳转过去之后出现tab2中的的fragment为黑色,如果点击back会返回到原来显示的界面,开始猜测是由于Fragment覆盖导致的,因为跳转到这个界面时,没有把之前的fragment关掉,所以出现了覆盖现象。
于是我将跳转目标改为MainActivity,通过intent传输的值来确定MainActivity初始标签是哪一个,测试发现还是出现了fragment为黑屏的现象,点击back会返回到原来显示的界面。后来想起来我Fragment采用的单例模式,也就是所有的Fragment都只能有一个实例,抱着测试的的态度,我将其改为了普通模式,也就是每次使用时,都新建一个实例,再进行上述测试,最终解决了问题。
在这个问题的调试过程中,着重学习了一下notification的使用,感觉有一篇文章写的不错,所以推荐一下。
Android Notification详解——响应notification事件
一般来讲,点击一个notification后,都会打开一个Activity做为对点击事件的响应,这个Activity是之前在PendingIntent中设置好的。
经常玩Android手机的应该都有印象,在日历应用中,你新建一个提醒,当提醒通知收到后,你点击通知,会进入提醒的内容页面,如果这个时候按back键,会直接退出应用。
但是在Gmail的应用中,如果有一封新邮件到来,那么点击通知后,会进入到邮件的内容页面,等你看完邮件,点击back键,会退到邮件列表页面,再按back键,才会退出应用。
我们总结一下两种情况,假设我们的应用有两个Activity(ParentActivity、SubActivity),notification中设置打开的Activity为SubActivity。
那么第一种情况就是:
点击Notification ——>进入SubActivity ——> back键 ——> 退出应用
第二种情况:
点击Notification ——>进入SubActivity ——> back键 ——> 退到ParentActivity ——>back键 ——>退出应用
第一种情况比较简单,只需要在PendingIntent中指定Activity,不需要其他设置,Android默认的就这样。
Java代码
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
但是在创建PendingIntent的时候需要注意参数PendingIntent.FLAG_CANCEL_CURRENT
这个标志位用来指示:如果当前的Activity和PendingIntent中设置的intent一样,那么久先取消当前的Activity,用PendingIntent中指定的Activity取代之。
另外,需要在Manifest中对指定的Activity设置属性
Java代码
<activity android:name=".SubActivityl"
android:launchMode="singleTask"
android:taskAffinity=""
android:excludeFromRecents="true">
</activity>
第二种情况稍微复杂点,因为如果只打开一个SubActivity,程序并没办法知道他的上一级Activity是谁,所以需要在点击Notification时打开一组Activity,但是我们并不需要一个个去调用startActivity方法,PendingIntent提供了个静态方法getActivities,里面可以设置一个Intent数组,用来指定一系列的Activity。
所以我们首先写一个函数创建一个Activity数组:
Java代码
Intent[] makeIntentStack(Context context) {
Intent[] intents = new Intent[2];
intents[0] = Intent.makeRestartActivityTask(new ComponentName(context, com.example.notificationtest.MainActivity.class));
intents[1] = new Intent(context, com.example.notificationtest.SubActivity.class);
return intents;
}
其中需要注意的是Intent.makeRestartActivityTask方法,这个方法用来创建activity栈的根activity
接下来,创建并显示Notification:
Java代码
void showNotification(Intent intent) {
Notification notification = new Notification(
R.drawable.status_icon,
"Hello World ticker text",
System.currentTimeMillis());
PendingIntent contentIntent = PendingIntent.getActivities(
this,
0,
makeIntentStack(this),
PendingIntent.FLAG_CANCEL_CURRENT);
notification.setLatestEventInfo(
this,
"Title",
"Hey, shall we have a dinner tonight",
contentIntent);
notification.flags |= Notification.DEFAULT_ALL;
mNM.notify(1, notification);
}
notification原文地址为:http://lovelydog.iteye.com/blog/1666340
相关文章推荐
- Fragment的使用与学习及使用过程中遇到的问题
- Fragment的使用与学习及使用过程中遇到的问题
- 使用观察者模式完美解决activity与fragment通信问题
- Fragment的使用与学习过程中遇到的问题
- 使用Fragment +searchview过程中遇到的问题
- ViewPager+Fragment使用过程中手动清除及更新Fragment遇到的问题
- Fragment的使用与学习及使用过程中遇到的问题
- FragmentTabHost、Viewpager、Fragment使用过程中白屏问题及解决
- OutLook样式类使用过程,弹出模式对话框时候,鼠标不能点击对话框按钮,的问题。
- 使用Visitor模式的现实问题(请教)
- VC++使用过程中的技巧及问题
- 如何解决mid使用过程中出现的以下问题(无效的过程调用或参数: 'mid')
- 使用myfaces过程中碰到的问题
- 使用Hashtable传递参数在jasperreport新版本中引发的问题
- BizTalk Server 2006使用过程中常见的问题及其解决办法
- 带输出参数的存储过程的使用及在C#中调用问题
- 使用SQL存储过程要特别注意的问题-注意顺序读取
- 使用vs.net过程中问题汇总
- 带输出参数的存储过程的使用及在C#中调用问题
- Microsoft Composite UI App Block使用过程的问题收集(一)