1. 程式人生 > >Android 反射呼叫方法並利用此方法展開android通知欄(相容4.2及以上)

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及以上版本中這個方法失效了,

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=" ")