最近领导让做一个UI项目的技术可行方案,要求按home键实现任意apk弹出一个launcher可选菜单。纠结一时,考虑到android本身状态机制,如果在任意apk运行界面弹出另一个可以选择的菜单,那当前apk中的当前activity必定运行onPause(),才能转到另一个acitvity去。这样就带来了一个问题,如果当前正在使用播放器播放电影,那么弹出框出来,必定让电影播放停止,这个用户体验太差了。所以,为了不影响上一个activity的正常运行,只能考虑到将“菜单”做成弹出框的形式,背景透明。思路确定后,就是实现。关键点就卡在了如果让dialog全屏显示,满足自定义布局。网上找了很多方法,最后终于找到个合适的。做了个小demo源码地址附在后面。
实现步骤:
1.android 4.4全套源码,中PhoneWindowManager.java (frameworks\base\policy\src\com\android\internal\policy\impl)修改函数
public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags)
中关于home键触发的代码,指定跳转到Dialog风格的acitity(要进入的packageName中的className)。例如:
private void testNewUIDemo(){
Intent mIntent = new Intent();
mIntent.setClassName("com.ott_pro.launcher", "com.ott_pro.launcher.TestDemoActivity");
mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(mIntent);
}
2.Dialog style Activity ,就是是在Androidmanifest.XML中加入android:them=“@style/DialogStyle”,然后在style.xml 中
<!-- Test demo -->
<style name="DialogStyle" parent="@android:style/Theme.Dialog">
<item name="android:windowIsFloating">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:backgroundDimAmount">0.3</item>
<item name="android:windowAnimationStyle">@null</item>
</style>
最后在DialogActivity的onCreat()加入
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dialog);
getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
}就行了,注意getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);这句是一定要的,而且必须在setContentView(R.layout.activity_dialog);之后,布局自定义,后续就和编写activity一样。
总结完毕,第一次写技术总结文章。不容易。
源码下载地址:http://download.csdn.net/detail/yql44137228/7580689