導航:首頁 > 操作系統 > androidmr

androidmr

發布時間:2023-06-10 02:49:37

1. 如何實現Android 布局背景模糊化處理

在模仿 IOS 密碼輸入頁面的時候發現其背景有模糊處理,於是了解了一下並記錄下來,以便使用.在Android 中具體實現方法如下

查考 http://www.cnblogs.com/lipeil/p/3997992.html

java代碼
private void applyBlur() {

// 獲取壁紙管理器
WallpaperManager wallpaperManager = WallpaperManager.getInstance(this.getContext());
// 獲取當前壁紙
Drawable wallpaperDrawable = wallpaperManager.getDrawable();
// 將Drawable,轉成Bitmap
Bitmap bmp = ((BitmapDrawable) wallpaperDrawable).getBitmap();

blur(bmp);
}

下面之所以要進行small 和big的處理,是因為僅僅靠ScriptIntrinsicBlur
來處理模式,不能到達更模式的效果,如果需要加深模式效果就需要先把背景圖片縮小,在處理完之後再放大.這個可以使用Matrix
來實現,而且這樣可以縮短模糊化得時間

Java代碼
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
private void blur(Bitmap bkg) {
long startMs = System.currentTimeMillis();
float radius = 20;

bkg = small(bkg);
Bitmap bitmap = bkg.(bkg.getConfig(), true);

final RenderScript rs = RenderScript.create(this.getContext());
final Allocation input = Allocation.createFromBitmap(rs, bkg, Allocation.MipmapControl.MIPMAP_NONE,
Allocation.USAGE_SCRIPT);
final Allocation output = Allocation.createTyped(rs, input.getType());
final ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
script.setRadius(radius);
script.setInput(input);
script.forEach(output);
output.To(bitmap);

bitmap = big(bitmap);
setBackground(new BitmapDrawable(getResources(), bitmap));
rs.destroy();
Log.d("zhangle","blur take away:" + (System.currentTimeMillis() - startMs )+ "ms");
}

private static Bitmap big(Bitmap bitmap) {
Matrix matrix = new Matrix();
matrix.postScale(4f,4f); //長和寬放大縮小的比例
Bitmap resizeBmp = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
return resizeBmp;
}

private static Bitmap small(Bitmap bitmap) {
Matrix matrix = new Matrix();
matrix.postScale(0.25f,0.25f); //長和寬放大縮小的比例
Bitmap resizeBmp = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
return resizeBmp;
}

2. Android內存的相關排查方法

mpsys meminfo 是Android系統提供的查詢內存命令,用該命令可以看到:
每個進程佔用的物理內存大小
系統內存分布狀態,包括
總的可用物理內存 Total RAM
當前可用物理內存 Free RAM
已用物理內存 Used RAM
不可見內存 Lost RAM

比如輸入該命令後輸出如下日誌:

該命令列印的最後一部分,反應系統級別的內存狀況:
Total RAM: 1015868 kB
Free RAM: 638914 kB (105418 cached pss + 180168 cached + 353328 free)
Used RAM: 211428 kB (186096 used pss + 8008 buffers + 520 shmem + 16804 slab)
Lost RAM: 165526 kB
Tuning: 96 (large 256), oom 20480 kB, restore limit 6826 kB (high-end-gfx)
裡面某些欄位的意義需要注意:
mpsys meminfo

OOM Killer(Out Of Memory Killer) 是Linux當中,內存保護機制的一種。當物理內存幾乎耗盡而又需要分配新內存時,會殺掉一些優先順序低的進程,釋放內存。
LowMemoryKiller 是Android的內存保護機制。當物理內存低於閾值,就會殺掉一些優先順序低的進程,釋放內存。

聯系:LowMemoryKiller 用到了 OOM Killer 的評分機制
區別:LowMemoryKiller 是通過閾值觸發,OOM Killer 是分配內存失敗時觸發

評分原理:
oom_adj,代表進程的優先順序, 數值越大,優先順序越低,越容易被殺。系統分16個級別(取值范圍[-16, 15]整數,不連續)
通過 cat /proc/xxx/oom_adj 查看,其中xxx是進程號
oom_score_adj: 在 oom_adj 基礎上的評分,取值范圍[-1000, 1000]
通過 cat /proc/xxx/oom_score_adj 查看,其中xxx是進程號

閾值查看,以98mv100為例:
cat /sys/mole/lowmemorykiller/parameters/minfree
1024,1536,2048,3072,3584,4096
cat /sys/mole/lowmemorykiller/parameters/adj
0,58,117,176,529,1000
上訴數值表示:可用內存低於 4096 4K 時,殺掉 oom_score_adj>=1000 的應用;可用內存低於 3584 4K 時,殺掉 oom_score_adj>=529 的應用,以此類推。

因此,客戶可以通過調整 minfree 的閾值來觸發 LowMemoryKiller 更頻繁地殺應用,從而為高優先順序應用省下內存。

在 mpsys meminfo 中,GPU內存被統計到了 Lost RAM 裡面了。

因此,當應用佔用GPU內存過高時,不會體現在 Used RAM 裡面,而是體現在 Lost RAM 中。反過來,如果發現有問題的時候 Lost RAM 很高,就需要看看GPU內存使用情況了。用以下命令:�
mount -t debugfs debugfs /sys/kernel/debug/
cat /sys/kernel/debug/mali/gpu_memory

130|root@MR820:/ # cat /sys/kernel/debug/mali/gpu_memory
Name (:bytes) pid mali_mem max_mali_mem external_mem ump_mem dma_mem

其中mali_mem列就是應用佔用的GPU內存

3. Android混合開發該怎麼搞

Cordova是一個廣泛使用的Hybrid開發框架,它提供了一套js和Native交互規范

在Cordova的SystemWebViewEngine類中可以

看到私有靜態void exposeJsInterface(WebView webView,CordovaBridge橋){
if((Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1)){
Log.i(TAG,「自Android版本以來已禁用addJavascriptInterface()橋接。」);
//錯誤是Java Strings不會自動轉換為JS字元串。
//在JS方面解決這個問題並不困難,但是更容易
使用提示橋來代替。
返回;
}
webView.addJavascriptInterface(新SystemExposedJsApi(橋), 「_cordovaNative」);
}

因此當Android系統高於4.2時,Cordova還是使用addJavascriptInterface這種方式,因為這個方法在高版本上安全而且簡單,低於4.2的時候,用什麼方法呢?

答案是WebChromeClient.onJsPrompt方法

WebView可以設置一個WebChromeClient對象,它可以處理js的3個方法

onJsAlert
onJsConfirm
onJsPrompt
這3個方法分別對應js的警告,確認,提示方法,因為只有提示接收返回值,所以js調用一個Native方法後可以等待Native返回一個參數。下面是cordova.js中的一段代碼:

/ **
*實現ExposedJsApi.java的API,但使用prompt()進行通信。
*這是在JellyBean之前使用的,其中addJavascriptInterface()被禁用。
* /
mole.exports = {
exec:function(bridgeSecret,service,action,callbackId,argsJson){
return prompt(argsJson,'gap:'+ JSON.stringify([bridgeSecret,service,action,callbackId]));
},
setNativeToJsBridgeMode:function(bridgeSecret,value){
prompt(value,'gap_bridge_mode:'+ bridgeSecret);
},
retrieveJsMessages:function(bridgeSecret,fromOnlineEvent){
return prompt(+ fromOnlineEvent,'gap_poll:'+ bridgeSecret);
}
};

然後只要在onJsPrompt方法中使用CordovaBridge來處理js的提示調用

/ **
*告訴客戶端向用戶顯示提示對話框。如果客戶端返回true,則WebView將假定客戶端將處理提示對話框並調用相應的JsPromptResult方法。
* <p />
*由於我們出於自己的目的黑客提示,我們不應該為此目的使用它們,也許我們應該破解console.log來代替!
* /
@Override
public boolean onJsPrompt(WebView視圖,String origin,String message,String defaultValue,final JsPromptResult result){
//與@JavascriptInterface橋不同,此方法始終在UI線程上調用。
String processedRet = parentEngine.bridge.promptOnJsPrompt(origin,message,defaultValue);
if(processedRet!= null){
result.confirm(processedRet);
} else {
dialogsHelper.showPrompt(message,defaultValue,new CordovaDialogsHelper.Result(){
@
Override public void gotResult(boolean success,String value){
if(success){
result.confirm(value);
} else {
result.cancel( );
}
}
});
}
return true;
}

閱讀全文

與androidmr相關的資料

熱點內容
手機app怎麼下載安裝 瀏覽:492
最新的java版本 瀏覽:993
萬卷小說緩存在哪個文件夾 瀏覽:687
st單片機怎樣燒 瀏覽:871
watch怎麼下載APP 瀏覽:821
銀行程序員面試 瀏覽:358
我的世界的伺服器為什麼不能更新 瀏覽:769
命令與征服絕命時刻比賽視頻 瀏覽:827
電腦捕獲視頻的文件夾怎麼換 瀏覽:482
windows編譯安卓軟體 瀏覽:210
加密dns列表 瀏覽:990
股市操練大全八冊pdf 瀏覽:120
c傳遞指針到python 瀏覽:163
手動添加引導的命令 瀏覽:54
740伺服器小藍條是做什麼的 瀏覽:523
linux文件操作命令 瀏覽:129
安卓手機圖片文件夾加鎖 瀏覽:781
steam提示音在哪個文件夾 瀏覽:340
項目開發全程實錄pdf 瀏覽:534
單片機reset 瀏覽:597