❶ 安卓如何實現懸浮窗口模擬返回鍵功能,實現全局返回
首先要設置你的activity為singleInstance。
//也可以overrideonBackPressed()
@Override
publicbooleanonKeyDown(intkeyCode,KeyEventevent){
if(keyCode==KeyEvent.KEYCODE_BACK){
moveTaskToBack(true);
returntrue;
}
returnsuper.onKeyDown(keyCode,event);
}
❷ android如何只在應用內顯示懸浮窗
Android懸浮窗實現使用WindowManager ,WindowManager介紹
通過Context.getSystemService(Context.WINDOW_SERVICE)可以獲得 WindowManager對象。
每一個WindowManager對象都和一個特定的 Display綁定。
想要獲取一個不同的display的WindowManager,可以用 createDisplayContext(Display)來獲取那個display的 Context,之後再使用:Context.getSystemService(Context.WINDOW_SERVICE)來獲取WindowManager。
使用WindowManager可以在其他應用最上層,甚至手機桌面最上層顯示窗口。
調用的是WindowManager繼承自基類的addView方法和removeView方法來顯示和隱藏窗口。具體見後面的實例。
另:API 17推出了Presentation,它將自動獲取display的Context和WindowManager,可以方便地在另一個display上顯示窗口。
❸ 如何實現android中監聽來電並生成懸浮窗體提示
android.permission.READ_PHONE_STATE"許可權
Xml代碼
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
還需要注冊來電監聽,目前我的處理方式是接收開機廣播,然後在接收到廣播後注冊來電監聽。接收開機廣播需要有「android.permission.RECEIVE_BOOT_COMPLETED」許可權,manifest中申明如下
java代碼
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
然後注冊廣播接收類
Xml代碼
<receiver android:name=".PhoneBootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
PhoneBootReceiver中注冊監聽來電,首先得獲取系統服務「TELEPHONY_SERVICE」
Java代碼
TelephonyManager telM = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
然後添加監聽
Java代碼
telM.listen(new TelListener(context), PhoneStateListener.LISTEN_CALL_STATE);
TelListener是自己定義的電話狀態監聽類,繼承自PhoneStateListener,監聽來電只需要實現onCallStateChanged(int
state, String incomingNumber)方法。
咳咳...標題上說了彈出懸浮窗口,其實懸浮窗口就是在WindowManager中添加一個View,這個功能我也是在TelListener實現的。要想實現懸浮窗口,首先得有「android.permission.SYSTEM_ALERT_WINDOW」的許可權,在manifest中申明如下:
Xml代碼
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
WindowManager需要通過context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
來獲取。
先把TelListener源碼放出來,再詳解
Xml代碼
public class TelListener extends PhoneStateListener {
private Context context;
private WindowManager wm;
private TextView tv;
public TelListener(Context context){
this.context = context;
}
@Override
public void onCallStateChanged(int state, String incomingNumber) {
// TODO Auto-generated method stub
super.onCallStateChanged(state, incomingNumber);
if(state == TelephonyManager.CALL_STATE_RINGING){
wm = (WindowManager)context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.type = WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
<span style="white-space: pre;"> </span>params.format = PixelFormat.RGBA_8888;
tv = new TextView(context);
tv.setText("這是懸浮窗口,來電號碼:" + incomingNumber);
wm.addView(tv, params);
}else if(state == TelephonyManager.CALL_STATE_IDLE){
if(wm != null){
wm.removeView(tv);
}
}
}
}
state
= TelephonyManager.CALL_STATE_RINGING表示有新的來電,state =
TelephonyManager.CALL_STATE_IDLE表示電話中斷(可能理解不是很准確,電話掛斷的時候state會和TelephonyManager.CALL_STATE_IDLE相等)
定義窗口布局
Java代碼
WindowManager.LayoutParams params = new WindowManager.LayoutParams();
設置窗口類型在所有窗口之上
Java代碼
params.type = WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
別忘了
Java代碼
params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
如果沒有這句話的話,在生成懸浮窗口後,懸浮窗口後的界面上東西都不能點。這句話的目的是讓懸浮窗口失去焦點。
背景透明
Java代碼
params.format = PixelFormat.RGBA_8888;
本例中懸浮窗口只是顯示一個TextView其內容為「這是懸浮窗口,來電號碼:xxxxxx」,最後將TextView添加到窗體中
Java代碼
wm.addView(tv, params);
在電話中斷後將TextView移除,否則會一直顯示的...
Java代碼
wm.removeView(tv);
啦..本文就到這兒了...
「啥?要可移動的?」
要想可以拖動的話,那給TextView添加setOnTouchListener,實現OnTouchListener的onTouchListener方法。
Java代碼
params.type = WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
修改為
Java代碼
params.type = WindowManager.LayoutParams.TYPE_PHONE;
因為TYPE_SYSTEM_OVERLAY的話是TextView獲取不到輸入焦點,也就沒法拖動了哈。
❹ Android桌面懸浮窗效果怎麼實現
可以模仿360手機衛士懸浮窗的那份代碼的基礎上繼續開發。
打開手機衛士主界面,然後上拉,然後點擊快捷設置,然後點擊桌面懸浮窗,就可以將360手機衛士安卓版桌面浮窗調出來了,具體步驟如下:
1、安裝最新的360手機衛士。
2、點開隱私保護,打開右上角的三個點。
3、點開衛士設置,點開懸浮窗。
4、開啟內存清理懸浮窗, 選擇顯示樣式,安仔樣式或是加速球。
5、可以選擇僅在桌面顯示,若開啟則懸浮窗只出現在桌面,若關閉則懸浮窗會跟隨打開頁面一直出現。
6、可以同時開啟拖動清理內存,這樣直接拖動懸浮窗圖標,就可以輕松清理內存了。
❺ 我想做一個android軟體,只有一個懸浮窗(一打開就是懸浮窗了)
進入360手機衛士-設置中心-手機衛士懸浮窗-樣式-百分比樣式就行了
❻ Android中可自由移動懸浮窗口的Demo,怎麼加懸浮窗口點擊事件
myFV.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0) { Log.i("foo","執行了點擊事件"); } });
❼ android 怎麼讓視屏懸浮
Android懸浮窗實現
下面實現來自於android學習手冊,裡面有實現的可運行的例子還有源碼。android學習手冊包含9個章節,108個例子,源碼文檔隨便看,例子都是可交互,可運行,源碼採用android studio目錄結構,高亮顯示代碼,文檔都採用文檔結構圖顯示,可以快速定位。360手機助手中下載,圖標上有貝殼
實現基礎
Android懸浮窗實現使用WindowManager ,WindowManager介紹
通過Context.getSystemService(Context.WINDOW_SERVICE)可以獲得 WindowManager對象。
每一個WindowManager對象都和一個特定的 Display綁定。
想要獲取一個不同的display的WindowManager,可以用 createDisplayContext(Display)來獲取那個display的 Context,之後再使用:Context.getSystemService(Context.WINDOW_SERVICE)來獲取WindowManager。
使用WindowManager可以在其他應用最上層,甚至手機桌面最上層顯示窗口。
調用的是WindowManager繼承自基類的addView方法和removeView方法來顯示和隱藏窗口。具體見後面的實例。
另:API 17推出了Presentation,它將自動獲取display的Context和WindowManager,可以方便地在另一個display上顯示窗口。
WindowManager實現懸浮窗需要聲明許可權
首先在manifest中添加如下許可權:
<!-- 顯示頂層浮窗 --><uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
注意:在MIUI上需要在設置中打開本應用的」顯示懸浮窗」開關,並且重啟應用,否則懸浮窗只能顯示在本應用界面內,不能顯示在手機桌面上。
服務獲取和基本參數設置
[java] view plain print?
// 獲取應用的Context
mContext = context.getApplicationContext();
// 獲取WindowManager
mWindowManager = (WindowManager) mContext
.getSystemService(Context.WINDOW_SERVICE);
參數設置:
final WindowManager.LayoutParams params = new WindowManager.LayoutParams();
// 類型
params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
// WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
// 設置flag
int flags = WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
// | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
// 如果設置了WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,彈出的View收不到Back鍵的事件
params.flags = flags;
// 不設置這個彈出框的透明遮罩顯示為黑色
params.format = PixelFormat.TRANSLUCENT;
// FLAG_NOT_TOUCH_MODAL不阻塞事件傳遞到後面的窗口
// 設置 FLAG_NOT_FOCUSABLE 懸浮窗口較小時,後面的應用圖標由不可長按變為可長按
// 不設置這個flag的話,home頁的劃屏會有問題
params.width = LayoutParams.MATCH_PARENT;
params.height = LayoutParams.MATCH_PARENT;
params.gravity = Gravity.CENTER;
// 獲取應用的Context
mContext = context.getApplicationContext();
// 獲取WindowManager
mWindowManager = (WindowManager) mContext
.getSystemService(Context.WINDOW_SERVICE);
//參數設置:
final WindowManager.LayoutParams params = new WindowManager.LayoutParams();
// 類型
params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
// WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
// 設置flag
int flags = WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
// | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
// 如果設置了WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,彈出的View收不到Back鍵的事件
params.flags = flags;
// 不設置這個彈出框的透明遮罩顯示為黑色
params.format = PixelFormat.TRANSLUCENT;
// FLAG_NOT_TOUCH_MODAL不阻塞事件傳遞到後面的窗口
// 設置 FLAG_NOT_FOCUSABLE 懸浮窗口較小時,後面的應用圖標由不可長按變為可長按
// 不設置這個flag的話,home頁的劃屏會有問題
params.width = LayoutParams.MATCH_PARENT;
params.height = LayoutParams.MATCH_PARENT;
params.gravity = Gravity.CENTER;
點擊和按鍵事件
除了View中的各個控制項的點擊事件之外,彈窗View的消失控制需要一些處理。
點擊彈窗外部可隱藏彈窗的效果,首先,懸浮窗是全屏的,只不過最外層的是透明或者半透明的:
具體實現
[java] view plain print?
package com.robert.floatingwindow;
import android.content.Context;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnKeyListener;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.view.WindowManager.LayoutParams;
import android.widget.Button;
/**
* 彈窗輔助類
*
* @ClassName WindowUtils
*
*
*/
public class WindowUtils {
private static final String LOG_TAG = "WindowUtils";
private static View mView = null;
private static WindowManager mWindowManager = null;
private static Context mContext = null;
public static Boolean isShown = false;
/**
* 顯示彈出框
*
* @param context
* @param view
*/
public static void showPopupWindow(final Context context) {
if (isShown) {
LogUtil.i(LOG_TAG, "return cause already shown");
return;
}
isShown = true;
LogUtil.i(LOG_TAG, "showPopupWindow");
// 獲取應用的Context
mContext = context.getApplicationContext();
// 獲取WindowManager
mWindowManager = (WindowManager) mContext
.getSystemService(Context.WINDOW_SERVICE);
mView = setUpView(context);
final WindowManager.LayoutParams params = new WindowManager.LayoutParams();
// 類型
params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
// WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
// 設置flag
int flags = WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
// | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
// 如果設置了WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,彈出的View收不到Back鍵的事件
params.flags = flags;
// 不設置這個彈出框的透明遮罩顯示為黑色
params.format = PixelFormat.TRANSLUCENT;
// FLAG_NOT_TOUCH_MODAL不阻塞事件傳遞到後面的窗口
// 設置 FLAG_NOT_FOCUSABLE 懸浮窗口較小時,後面的應用圖標由不可長按變為可長按
// 不設置這個flag的話,home頁的劃屏會有問題
params.width = LayoutParams.MATCH_PARENT;
params.height = LayoutParams.MATCH_PARENT;
params.gravity = Gravity.CENTER;
mWindowManager.addView(mView, params);
LogUtil.i(LOG_TAG, "add view");
}
/**
* 隱藏彈出框
*/
public static void hidePopupWindow() {
LogUtil.i(LOG_TAG, "hide " + isShown + ", " + mView);
if (isShown && null != mView) {
LogUtil.i(LOG_TAG, "hidePopupWindow");
mWindowManager.removeView(mView);
isShown = false;
}
}
private static View setUpView(final Context context) {
LogUtil.i(LOG_TAG, "setUp view");
View view = LayoutInflater.from(context).inflate(R.layout.popupwindow,
null);
Button positiveBtn = (Button) view.findViewById(R.id.positiveBtn);
positiveBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
LogUtil.i(LOG_TAG, "ok on click");
// 打開安裝包
// 隱藏彈窗
WindowUtils.hidePopupWindow();
}
});
Button negativeBtn = (Button) view.findViewById(R.id.negativeBtn);
negativeBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
LogUtil.i(LOG_TAG, "cancel on click");
WindowUtils.hidePopupWindow();
}
});
// 點擊窗口外部區域可消除
// 這點的實現主要將懸浮窗設置為全屏大小,外層有個透明背景,中間一部分視為內容區域
// 所以點擊內容區域外部視為點擊懸浮窗外部
final View popupWindowView = view.findViewById(R.id.popup_window);// 非透明的內容區域
view.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
LogUtil.i(LOG_TAG, "onTouch");
int x = (int) event.getX();
int y = (int) event.getY();
Rect rect = new Rect();
popupWindowView.getGlobalVisibleRect(rect);
if (!rect.contains(x, y)) {
WindowUtils.hidePopupWindow();
}
LogUtil.i(LOG_TAG, "onTouch : " + x + ", " + y + ", rect: "
+ rect);
return false;
}
});
// 點擊back鍵可消除
view.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
WindowUtils.hidePopupWindow();
return true;
default:
return false;
}
}
});
return view;
}
}
❽ 如何開啟 android 手機懸浮框許可權
是否給許可權,是否開懸浮窗? 請在手機系統設置--應用軟體--找到騰訊手機管家,給予管家懸浮窗許可權。 打開騰訊手機管家——個人中心——懸浮窗——打開小火箭 在手機桌面會有一個顯示內存比例的空心圓,下拉空心圓圖形到手機桌面底端,會出現一個「小火箭」形狀的圖案,你拖 住然後釋放之後,小火箭會騰空而起發射進行清理內存為手機加速。 成功發射火箭後,會彈出提示框,提示所結束的進程以及此次發射所釋放的運行內存。
❾ 如何在Android中實現懸浮Activity
懸浮窗口的實現涉及到WindowManager,懸浮窗口是不隸屬於Activity界面的。
調用WindowManager,並設置WindowManager.LayoutParams的相關屬性,通過WindowManager的addView方法創建View,這樣產生出來的View根據WindowManager.LayoutParams屬性不同,效果也就不同了。比如創建系統頂級窗口,實現懸浮窗口效果!
給你個網址自己看吧http://www.cnblogs.com/GnagWang/archive/2011/02/06/1949569.html
❿ android java 怎麼設置懸浮窗(懸浮窗是一個activity)上組件的屬性,和按鈕的點擊
@Override
public void onClick(View v) {
final EditText et = new EditText(context) ;
new AlertDialog.Builder(context)
.setTitle("說明")
.setMessage("單個頁卡內按鈕事件測試")
.setView(et)
.setPositiveButton("確定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(context, "單擊確定按鈕", Toast.LENGTH_LONG).show() ;
}
}).setNegativeButton("取消",null).show();
}