论坛风格切换
  • 3311阅读
  • 0回复

悬浮窗口控制在应用内不显示只在主界面显示 [复制链接]

上一主题 下一主题
离线太史慈
 

发帖
766
金币
626
威望
556
只看楼主 倒序阅读 使用道具 楼主  发表于: 2013-08-12
最近写了一个app,有个像360那样的悬浮框。如图:



主界面上有个小的按钮,点击下即会弹出滚轮。


悬浮框的机制不多说,论坛里面各种源码,但是怎么控制在应用内不显示只在主界面显示,这个是个难题,找个好几天都没找到(很无耻地把hao123的滚轮图片抄来)。本来想用线程来控制的,担心消耗内存。

悬浮框是用service加载view的。首先在service创建的时候,创建了一个timer,开启了一个定时任务,定时发送广播。

[code brush:text;toolbar:false;] private void initTimer() {
timer = new Timer();
timerTask = new TimerTask() {
@Override
public void run() {
// System.out.println("定时发送广播");
Intent intent = new Intent("com.xxx.xxx");
sendBroadcast(intent);
}
};
timer.schedule(timerTask, 1500, 1500);
}[/code]
service销毁的时候,把timer给注销掉。
[code brush:text;toolbar:false;]timerTask.cancel(); //这个不清理的话,time会叠加执行。
timer.cancel();[/code]AndroidManifest.xml里面加上广播的声明:
[code brush:text;toolbar:false;]<receiver android:name=".service.FloatReveive" android:enabled="true" android:exported="false">
<intent-filter android:priority="901">
<action android:name="com.xxx.xxx"></action>
</intent-filter>
</receiver>[/code]创建一个广告的接收器,
Android 如何判断一个应用在运行,网上有方案,这里得到了当前窗口的类名:getClassName,然后和com.android来进行判断。如果在主界面,就隐藏悬浮框。
[code brush:text;toolbar:false;]public class FloatReveive extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
ComponentName cn = am.getRunningTasks(1).get(0).topActivity;
String className = cn.getClassName();
String string = "com.android";
if(className.indexOf(string) == 0) { //进入主界面
FloatOneService.showFloat();
} else {
FloatOneService.hideFloat();
}
}
}[/code]
但是目前遇到个问题:
1、某些手机用这个判断不准比如到主界面的时候,仍然不显示悬浮框,但是到了拨打电话的界面,就显示了。
2、另外再弱弱的问个问题:Gallery和ViewPage如何选择的问题(图片轮播)
3、本帖来源:http://www.phpwind.me/54143.html
快速回复
限100 字节
如果您在写长篇帖子又不马上发表,建议存为草稿
 
提到某人:
选择好友
上一个 下一个