在之前处理过一个问题在任意窗口前弹出rss更新提醒对话框,如下页面:
http://www.cnblogs.com/sipher/articles/2502092.html
利用上面的方法可以弹出窗口,不过没有办法在窗口中启动一个activity。
于是最近看有没有其他办法可以实现,想到在alertDialog中无法启动,那就还是弹出一个activity模拟窗口,再在其中启动activity。
代码如下:
private void showRssUpateRemindDialog() { view = View.inflate(getApplicationContext(), R.layout.rss_update_remind, null); // Show only 10 if the updated rss are morn than 10 int rssUpdateCount = 0; String rssUpdateCountStr = ""; ...... // set the count of the updated rss TextView rssCount = (TextView) view.findViewById(R.id.rss_update_count); rssCount.setText(rssUpdateCountStr); TextView rssUpdateTitleAll = (TextView) view .findViewById(R.id.rss_upate_title_all); rssUpdateTitleAll.setText(rssUpateTitleAll.toString()); view.findViewById(R.id.btn_rss_remind_ok).setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { Intent intent = new Intent(); Bundle bundle = new Bundle(); ...... intent.putExtras(bundle); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setClass(getApplicationContext(), xxxxActivity.class); startActivity(intent); mWm.removeView(view); } }); view.findViewById(R.id.btn_rss_remind_cancel).setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { mWm.removeView(view); } }); mWm=(WindowManager)getApplicationContext().getSystemService("window"); WindowManager.LayoutParams wmParams = new WindowManager.LayoutParams(); wmParams.type=WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; wmParams.width=600; wmParams.height=400; wmParams.alpha = 10; mWm.addView(view, wmParams); }
这样同样实现了和之前一样的效果,除了窗体格式需要再调整之外。
可是,虽然可以弹出窗体,不过点击窗体中的按钮,在某些位置,譬如andoid桌面,web浏览器前,无法开启一个新的activity。
调试后发现,按钮的onClick事件虽然执行,不过没有办法叫起新的activity。
于是,修改 startActivity(intent); ----> getApplicationContext().startActivity(intent);
成功开启新的activity!!!虽然可以作为一个替代方案,不过仍然不是我理想中的效果。
A activity中可以打开B activity,现在要在任意位置弹出一个窗体,按其中的按钮,呼叫出B activity。
利用上面的方法,会同时打开A activity和B activity两个。
不知道有没有什么办法可以解决呢?(上面的修改,用在之前打开AlertDialog方式中也是同样效果。)
---------------------------------------------------------------------------------------
在查资料中,试验出如下方法可以查看是否在当前home开启应用程式
ActivityManager mActivityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); List<RunningTaskInfo> rti = mActivityManager.getRunningTasks(30); String pg = new String(); for (int i =0; i< rti.size(); i++) { pg = rti.get(i).baseActivity.getPackageName(); if (pg.equals("com.android.launcher")) { break; } if (pg.equals("com.xxxx.home")) { break; } }
//------------------------------------------------------------------------
绝对的意外发现!!!!!!
因为在使用getApplicationContext().startActivity(intent);打开B activity时,
必须要添加intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);,这样就会重复打开B activity。
为了解决这个问题,在AndroidManifest.xml中B activity中添加这句:android:launchMode="singleInstance",
发现B activity不会重复打开,同时意外发现,
当在A activity外呼叫B activity时,A activity不会打开只是开启了B activity!!!!!!!
但不明白为何,哪位高人帮忙解释下。