在桌面长按HOME的话,HTC的手机会显示最近用过的程序列表,不建议修改。
如果是在你自己的应用中处理长按的话倒是可以,直接运行应用就行了,系统会帮你判断该应用是否启动,若启动则resume,否则就去start。PS:但是拦截HOME这个是不通用的,也就是说不是所有手机都能拦截到HOME,因为很多厂商都把home按键事件拦截了...
如果是在你自己的应用中处理长按的话倒是可以,直接运行应用就行了,系统会帮你判断该应用是否启动,若启动则resume,否则就去start。PS:但是拦截HOME这个是不通用的,也就是说不是所有手机都能拦截到HOME,因为很多厂商都把home按键事件拦截了...
解决方案 »
- 用android sdk4.0 开发的软件可以在2.3的系统上运行吗?
- 请问日程提醒功能该怎么添加
- //求教有关蓝牙的问题,急!!
- android 手机锁屏之后,锁屏的时间和状态栏的时间不一样(出现概率很小),有处理过此问题的没有?
- WebView在手机上使用时发现不能加载图片。
- “The operation cannot be completed. See the details ”
- 求大神指点,我用百度地图api开发的地图怎么不能在手机上运行
- Android的Button设置20dp的宽高之后,文字不能正常显示,形状也不对
- 来小伙伴们围观下,解决下
- 怎么每次编辑虚拟器的时候Device都是空的?
- 如何获取布局文件中定义的按钮
- sbgoogle ! ANDROID为什么必须要连网才能搭环境呀。
怎么控制一个APK去RESUME或者START?怎么写代码实现这个?
我们都知道Android平台没有任务管理器,而内部App维护者一个Activity history stack来实现窗口显示和销毁,对于常规从快捷方式运行来看都是startActivity可能会使用FLAG_ACTIVITY_NEW_TASK标记来打开一个新窗口,比如Launcher,所以考虑单任务的实现方法比较简单,首先Android123纠正下大家一种错误的方法就是直接在androidmanifest.xml的application节点中加入android:launchMode="singleInstance"这句,其实这样将不会起到任何作用,Apps内部维护的历史栈作用于Activity,我们必须在activity节点中加入android:launchMode="singleInstance" 这句才能保证单实例,当然一般均加在主程序启动窗口的Activity。
7.3 首先,我们来说1——如何动态更新当前显示的Activity
如果是传统的开发,或许您会说那很简单,把每个屏幕上元素的字符都重设一遍就好了。是的,
这么做是很简单,但我不得不说,它的工作量和维护成本实在是不可预知的;而且,除了字符,
在其它方面,如layout、drawable 等,都可能受Locale 影响。所以,我们需要一种更通用、
更简洁的方法。
应该注意,下面我介绍的方法,是即使在Google 的android 讨论组里也搜不到的。那么这个
方法是什么呢?那就是重新启动一个Activity。
或许您会觉得这个方法消耗过大,但如果您想到,其实android 屏幕方向改变都能导致Activity
重起也就释然了。而且,这个方法我其实借用了一个假设,那就是大家都已经了解、考虑并且为
了Activity 的生命周期做出了一定的努力, 已经良好的实现了
onRestoreInstanceState(savedInstanceState) 和onSaveInstanceState(bundle)。当
然,如果您的应用根本不担心生命周期,那么你就更没问题了。但如果您的应用在生命周期这一
问题上,还有问题,那很遗憾,您最好还是先把生命周期这个严重的问题搞好吧。下面我们就来
看代码,实现方法如下。
首先,在用户改变语言区域后,调用如下代码
Locale locale = getLocaleFormPreference(this);
Configuration cfg = getResources().getConfiguration();
if(locale!=null && !locale.equals(cfg.locale)) {
Bundle bundle = new Bundle();
onSaveInstanceState(bundle);
Intent intent = getIntent();
intent.putExtra("InstanceState", bundle);
intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
startActivity(intent);
finish();
}
之后,在被启动的Activity 的onCreate(Bundle savedInstanceState)的最后位置运行下面
的代码:
if(savedInstanceState == null) {
savedInstanceState =
getIntent().getBundleExtra("InstanceState");
if(savedInstanceState != null) {
onRestoreInstanceState(savedInstanceState);
}
}
下面,我再为大家一行一行的,讲解一下这两段代码:
• 首先,我们在第1 段代码的前4 行对Locale 进行了一下判断,使得只在Locale 发生
变化的情况下,才重起Activity。
• 之后,5~8 行,我们手动调了的onSaveInstanceState(bundle)方法,获得了恢复
Activity 所需要的信息,并以"InstanceState"为Key 存入了Intent。
• 第9 行,我们为Intent 添加了一个flag——FLAG_ACTIVITY_FORWARD_RESULT。
这一步,是可选的,目的是如果当前的Activity 需要给启动它的Activity 一个回复的
code 时,由它新启动的Activity 来回复。
• 最后10~11 行是启动新的Activity 并终止当前的。
• 而第2 段代码则是通过判断savedInstanceState 来选择和模拟系统restart 一个
Activity 的过程。因为默认新启动Activity 时,savedInstanceState 是空的,而重启
动时savedInstanceState 会带有信息,因此我们可以这样去模拟。
这里,同样有两点需要注意:
1. 这段代码需要在根Activity 上执行,如果您应用了ActivityGroup 并需要在child 上执
行更新操作。请相应更改第一段代码的第6、7 行,调用根Activity 上的方法。而第2
段代码,仍然放在根Activity 的onCreate(Bundle savedInstanceState)里。
2. 如果您处理生命周期的操作,除了在onRestoreInstanceState()里,其他地方,也有
操作,请自行想办法,按照您需要的顺序模拟restart 操作。