Android 反射呼叫方法並利用此方法展開android通知欄(相容4.2及以上)
前段時間由於專案需要實現了展開通知欄的功能,所謂展開通知欄,就是通過expand statusbar的方式將所有通知顯示出來,也就是手勢由頂部下滑展開的介面,statusbar屬於全域性且系統級別的介面,API中並沒有開放獨立的介面供我們呼叫以完成通知欄的展開,所以這裡需要用到反射,通過反射呼叫方法,使用的方法是invoke(),這個方法是Method的方法,可能大家不太理解,我對這部分也知之甚少,用我自己最粗淺的理解就是,通過方法名建立Method物件,通過該物件的invoke()方法反射出方法(這一步其實就是方法的執行),供我們呼叫,這樣說起來很蒼白,先上一段程式碼解釋下吧。
public class Test { public static void main(String args[]){ A a = new A; Class class = A.getClass(); Method m1 = class.getDeclaredMethod("outInfo"); Method m2 = clazz.getDeclaredMethod("setMsg", String.class); Method m3 = clazz.getDeclaredMethod("getMsg"); m1.invoke(a); m2.invoke(a, "重新設定msg資訊!"); String msg = (String) m3.invoke(a); System.out.println(msg); } } class A { private String msg; public A(String msg) { this.msg = msg; } public void setMsg(String msg) { this.msg = msg; } public String getMsg() { return msg; } public void outInfo() { System.out.println("這是測試Java反射的測試類"); } }
這裡用到的是最簡單的反射呼叫方法的實現,更深入的反射的使用還需要我們繼續深入的學習,下面就是解決android展開通知欄的問題,先上程式碼再粗淺的解釋下。
public void OpenNotify() { // TODO Auto-generated method stub try { Object service = getSystemService("statusbar"); Class<?> statusbarManager = Class .forName("android.app.StatusBarManager"); Method expand = null; if (service != null) { expand = statusbarManager.getMethod("expand"); expand.setAccessible(true); expand.invoke(service); } } catch (Exception e) { } }
首先我們需要獲得系統服務,前面說過,statusbar是全域性且系統級別的佈局,然而對其實現展開還需要增加一項許可權,這個不能忽略
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
然後,通過StatusBarManager的包名反射得到statusbarManager物件,再通過expand方法名得到Method這個類的物件expand,下面執行該方法,expand.invoke().這樣便能實現展開通知欄,這個方法在android4.2以下版本中測試良好,可是近來發現4.2及以上版本中這個方法失效了,
仔細看右上角有個頭像按鈕,點選這個,通知欄便會翻轉至另外一個介面,同樣是通過通知欄的形式展示的,如下圖
這便進入了快速設定的功能,這對於使用者來說是非常方便的,同樣我們可以通過點選右上角的按鈕返回上面通知欄的介面。這點改進對使用者來說十分方便,但是開發者就遇到了問題,常用的展開方法失效了,我查了官網也沒看到相關的API的更新,於是我上了神網stackoverflow,反編譯了別的APK,最後終於被我試出來了,現在把程式碼給大家貼一下。
public void OpenNotify() {
// TODO Auto-generated method stub
int currentApiVersion = android.os.Build.VERSION.SDK_INT;
try {
Object service = getSystemService("statusbar");
Class<?> statusbarManager = Class
.forName("android.app.StatusBarManager");
Method expand = null;
if (service != null) {
if (currentApiVersion <= 16) {
expand = statusbarManager.getMethod("expand");
} else {
expand = statusbarManager
.getMethod("expandNotificationsPanel");
}
expand.setAccessible(true);
expand.invoke(service);
}
} catch (Exception e) {
}
}
就是在上面程式碼的基礎上做了點改進,很一目瞭然,不做多的解釋了。要說聲抱歉,第一次發的文章格式很有問題,現在已經改正了。
相關推薦
Android 反射呼叫方法並利用此方法展開android通知欄(相容4.2及以上)
前段時間由於專案需要實現了展開通知欄的功能,所謂展開通知欄,就是通過expand statusbar的方式將所有通知顯示出來,也就是手勢由頂部下滑展開的介面,statusbar屬於全域性且系統級別的介面,API中並沒有開放獨立的介面供我們呼叫以完成通知欄的展開,所以這裡
Java 反射呼叫類的屬性和方法(包含父類私有屬性和覆蓋重寫的方法等)
前面介紹了,反射呼叫類的構造方法來建立類的例項物件。一個類的結構包含方法(構造,靜態,非靜態)和屬性(靜態和非靜態)。按照迴圈漸進的方式,接下來,介紹反射類中屬性和普通的方法。 在這裡簡單介紹,反射呼叫屬性和方法會用到的新類,Method類和Field類。
EventBus原始碼分析(三):post方法釋出事件【獲取事件的所有訂閱者,反射呼叫訂閱者事件處理方法】(2.4版本)
EventBus維護了一個重要的HashMap,這個HashMap的鍵是事件,值是該事件的訂閱者列表,因此post事件的時候就能夠從此HashMap中取出事件的訂閱者列表,對每個訂閱者反射呼叫事件處理方法。 private final Map<Cla
Java通過反射呼叫一個類的私有方法
本文轉載自:https://www.cnblogs.com/ghq120/p/8439204.html獲得私有方法的流程是(1)獲取目標類(2)獲取目標方法 Method method=clazz.getDeclaredMethod(name);//可以呼叫類中的所有方法(
Linux 環境下 Java jdk 安裝方法 注:此方法為 jdk.bin型別的jdk檔案
1、將jdk檔案放到一個目錄下 例如:jdk.bin 例如 /usr/java 放到了這個這個目錄下 2、然後利用命令檢視目錄下是否有此檔案 # cd /usr/java # ls 如果顯示檔案 jdk.bin 3、解壓jdk.bin檔案 # chmod 755 jdk.bin # ./jdk.b
android js呼叫java 並取得java當中的返回值返回到js的做法其實很簡單,打包後出現問題記得修改proguard.cfg檔案
package wst.webview; import android.annotation.SuppressLint; import android.app.Activity; import android.os.Bundle; import android.view.View; import andr
android反射呼叫 .
PowerManager類並沒有提供關機的shutdown介面,而是通過IBinder這種Android中特有的通訊模式,與PowerManagerService 類進行通訊。PowerManagerService是PowerManager 類中定義的介面的具體實
MAC Android Studio用android手機進行除錯並實時同步在電腦上顯示(錄屏gif體積小清晰)
第一步:Mac電腦使用Android Studio進行真機除錯 第二步:Vysor:一款連線Android裝置和Chrome的神奇工具! 第三步:翻牆(藍燈)下載Vysor chrome外掛 第四步:Vysor chrome外掛破解 1.9.3 (Mac) 破解可以顯示更高清的
Android獲取系統相簿圖片並裁剪(相容4.4以上版本)
相信很多同學遇到過在專案中要上傳相簿中的圖片,然而卻因為各種版本android手機,會有些不相容的問題。 我們在開啟系統相簿時,通常會有兩種做法: Intent.ACTION_PICK 直接開啟系統相簿 <span style="font-size:18px;"&
MATLAB基本的使用方法(影象,矩陣及函式)
讀取影象:用imread函式讀取影象檔案,檔案格式可以是TIFF、JPEG、GIF、BMP、PNG等。比如 >> f = imread('chestxray.jpg'); 讀進來的影象資料被儲存在變數f中。尾部的分號用來抑制輸出。如果圖片是彩色的,可以用rgb2gray轉換成灰度圖: >
上傳EXCEL檔案到後端,匯入並解析EXCEL的前後端實現(Vue.js + java後端)
vue.js前端,Java後端,如何匯入excel檔案,並且解析,本文給了前後端程式碼的實現,以及完美實踐OK之後的分享。 前端主要用了element-ui的upload元件。 關於這個元件的官方文件很少:http://element-cn.eleme.io/#/zh-CN/compon
利用theano編寫logistic迴歸模型(A Real Example: Logistic Regression)
A Real Example: Logistic Regression 程式碼註釋的已經比較詳細,請仔細閱讀! import numpy import theano import theano.tensor as T import matplotlib.pyp
利用 Postman-同步瀏覽器登入狀態(postman介面傳入登入態)
一、先安裝Postman,Postman Interceptor(Chrome商店搜尋); 二、點選chrome上相應圖示,點選Postman Chrome app 三.開啟postman,開啟這個配置 這時候在postman中,就可
呼叫儲存過程一次後,程式崩潰 (臨時表和表變數)
編寫了一個顯示資料的儲存過程,前臺視窗首次呼叫顯示資料正常,退出再次進入該視窗是程式崩潰 原因是:不要使用臨時表#temp,最好使用表變數@temp 我的簡單理解即使你在儲存過程中刪除了臨時表,但是也會導致程式出錯 下面深刻認識一下臨時表和表變數吧
Linux從Ftp上下載最新檔案,並儲存到指定目錄(實現有點2--)
#!/bin/bash #PS4="#:" #set -x ip=a.b.c.d user=*** passwd=*** srcdir=~/Game ftp -n << ! open $ip 21 user $user $passwd prompt binary dir /server/Linux
Linux基礎:利用SSH上傳、下載(使用sz與rz命令)
1、簡述 通常,利用SSH管理遠端Linux伺服器時,經常需要與本地互動檔案。當然,我們可以利用FTP方式,比如通過Filezilla客戶端軟體。不過直接使用SSH軟體(SecureCRT、Xshell)自帶的上傳和下載功能無疑使最方便快捷的。通常SSH軟體支援的檔
[Android] 一個將當前螢幕儲存為圖片檔案的類(簡單說就是抓屏)
現在無論是應用,還是遊戲中,都經常會有分享的功能。分享,不僅要分享文字,也要分享應用或者遊戲的螢幕截圖,這樣才能做到圖文並茂,吸引到更多的使用者。想要做圖片的分享功能,首先就需要抓屏,將當前螢幕儲存為一個圖片檔案。下面就是一個將當前的Activity直接儲存為一個圖片檔案的類
android 獲取手機唯一標識(遇到的問題及處理)
我們專案中有一個需求,那就是獲取同一使用者進行簽到時候只能使用一個裝置,在17年之前還可以正常使用,最近新增一個手機唯一標識許可權開啟管理,從而影響了最早之前的邏輯處理在這裡專門做一個記錄,來警醒自己。最早之前部落格 http://blog.csdn.net/u0140075
Android自定義元件之日曆控制元件-精美日曆實現(內容、樣式可擴充套件)
需求 我們知道,Android系統本身有自帶的日曆控制元件,網路上也有很多開源的日曆控制元件資源,但是這些日曆控制元件往往樣式較單一,API較多,不易於在實際專案中擴充套件並實現出符合具體樣式風格的,內容可定製的效果。本文通過自定義日曆控制元件,實現了在內容和樣
利用python輸出乘法口訣表(正序和倒序)
This is my first csdn. 正序如下: for i in range(1,10): for j in range(1,i+1): print(str(i)+"*"+str(j)+"="+str(i*j),end=" ")