藍光最耗電? 暗黑模式為手機省電? Google 以數據證明

不少人喜愛在手機 App 內啟用黑暗模式, 把 App 的底色調節為更暗的顏色, 在晚間用手機也不怕壞眼, 也更為省電. Google 就在一個 Android 開發者論壇當中, 向開發者介紹如何能在 App 設計層面, 避免令手機消耗大量電力的方法, 更全面推廣 Dark Mode 暗黑模式, 以數據展示它如何能為用戶省電, 希望眾開發者多多參考.

根據外媒《Slashgear》報道, 在日前的 Android 開發者會議當中, 向開發者介紹如何在 App 開發層面, 避免令手機的續航力大幅減少. 首先 Google 指出熒幕亮度與電池使用量呈」直線關係」, OLED 熒幕與 LCD 熒幕的耗電量亦有所分別. 把第一代 Google Pixel(使用 AMOLED) 與 iPhone 7(使用LCD) 進行比較, 前者在啟用 Google 地圖的夜間模式之後, 耗用電力可由 250mA 大幅減至 92mA, 減幅達 63%. iPhone 7 的電池耗用量在一般模式與夜間模式沒有任何分別, 同樣是 230mA.

接下來是顏色與電力耗用的關係. 在 Google Pixel 使用最大光亮度顯示全頁單色畫面的情況下, 顯示白色, 藍色所耗用的電力最大, 而顯示綠色, 紅色畫面所耗用的電力最小.

Google 進一步介紹黑暗模式 Dark Mode, 他們認為黑暗模式可有效減低電池消耗. 在 100% 亮度的情況下, 一般模式耗用電力 239mA, 如開啟暗黑模式, 則能有效降低耗用電力至 96mA, 節省達 6 成電池消耗. 但如熒幕光亮度調節到 50%的情況下, 效果則只有 14%.

心理作用多於實際!!!

資料來源: Slashgear,Android Settings

艾菲都有失手時……

話說我果部好快既雷蛇,其實慢左半個月。

而且電力仲要倒水咁倒。

原因係因為艾菲手痕,加爆ram使用。

唔係話用盡D ram會順D?咁就奶野,呢個就係Android奇妙之處。

結果我減番deox,dalvik等,降低但依然做大參數,然後將start cache大幅增大。

而家部機又快番了。

當然,係快過以前。

所以你地咪睇superboost而家又快又慳電,艾菲仆街左唔知幾多次你地唔知姐。😂

後台清理

360桌面、金山清理大師等都提供了一鍵清理、一鍵加速等功能,其實就是殺一些後台進程來達到釋放內存的目的。

基本思路就是列出所有運行的進程,查看其重要值(RunningAppProcessInfo.importance,值越大說明進程重要程度越低),可以設定一個閾值,

如果該進程的重要值大於該閾值,就可以殺掉該進程。

進程的重要值有以下幾個等級:

/**
* Constant for {@link #importance}: this is a persistent process.
* Only used when reporting to process observers.
* @hide
*/
public static final int IMPORTANCE_PERSISTENT = 50;

    /**
     * Constant for {@link #importance}: this process is running the
     * foreground UI.
     */
    public static final int IMPORTANCE_FOREGROUND = 100;

    /**
     * Constant for {@link #importance}: this process is running something
     * that is actively visible to the user, though not in the immediate
     * foreground.
     */
    public static final int IMPORTANCE_VISIBLE = 200;

    /**
     * Constant for {@link #importance}: this process is running something
     * that is considered to be actively perceptible to the user.  An
     * example would be an application performing background music playback.
     */
    public static final int IMPORTANCE_PERCEPTIBLE = 130;

    /**
     * Constant for {@link #importance}: this process is running an
     * application that can not save its state, and thus can't be killed
     * while in the background.
     * @hide
     */
    public static final int IMPORTANCE_CANT_SAVE_STATE = 170;

    /**
     * Constant for {@link #importance}: this process is contains services
     * that should remain running.
     */
    public static final int IMPORTANCE_SERVICE = 300;

    /**
     * Constant for {@link #importance}: this process process contains
     * background code that is expendable.
     */
    public static final int IMPORTANCE_BACKGROUND = 400;

    /**
     * Constant for {@link #importance}: this process is empty of any
     * actively running code.
     */
    public static final int IMPORTANCE_EMPTY = 500;

直接上代碼:
package com.android.clearmemory;

import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.MemoryInfo;
import android.app.ActivityManager.RunningAppProcessInfo;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.util.List;

public class ClearMemoryActivity extends Activity {
private static final String TAG = “ClearMemoryActivity”;

/**
 * Called when the activity is first created.
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button clear = (Button) findViewById(R.id.clear);
    clear.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //To change body of implemented methods use File | Settings | File Templates.
            ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
            List<RunningAppProcessInfo> infoList = am.getRunningAppProcesses();
            List<ActivityManager.RunningServiceInfo> serviceInfos = am.getRunningServices(100);

            long beforeMem = getAvailMemory(ClearMemoryActivity.this);
            Log.d(TAG, "-----------before memory info : " + beforeMem);
            int count = 0;
            if (infoList != null) {
                for (int i = 0; i < infoList.size(); ++i) {
                    RunningAppProcessInfo appProcessInfo = infoList.get(i);
                    Log.d(TAG, "process name : " + appProcessInfo.processName);
                    //importance 該進程的重要程度  分為幾個級別,數值越低就越重要。
                    Log.d(TAG, "importance : " + appProcessInfo.importance);

                    // 一般數值大於RunningAppProcessInfo.IMPORTANCE_SERVICE的進程都長時間沒用或者空進程了
                    // 一般數值大於RunningAppProcessInfo.IMPORTANCE_VISIBLE的進程都是非可見進程,也就是在後台運行著
                    if (appProcessInfo.importance > RunningAppProcessInfo.IMPORTANCE_VISIBLE) {
                        String[] pkgList = appProcessInfo.pkgList;
                        for (int j = 0; j < pkgList.length; ++j) {//pkgList 得到該進程下運行的包名
                            Log.d(TAG, "It will be killed, package name : " + pkgList[j]);
                            am.killBackgroundProcesses(pkgList[j]);
                            count++;
                        }
                    }

                }
            }

            long afterMem = getAvailMemory(ClearMemoryActivity.this);
            Log.d(TAG, "----------- after memory info : " + afterMem);
            Toast.makeText(ClearMemoryActivity.this, "clear " + count + " process, "
                        + (afterMem - beforeMem) + "M", Toast.LENGTH_LONG).show();
        }
    });

    ClearMemoryFloatView.instance(getApplicationContext()).createView();
}

//獲取可用內存大小
private long getAvailMemory(Context context) {
    // 獲取android當前可用內存大小
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    MemoryInfo mi = new MemoryInfo();
    am.getMemoryInfo(mi);
    //mi.availMem; 當前系統的可用內存
    //return Formatter.formatFileSize(context, mi.availMem);// 將獲取的內存大小規格化
    Log.d(TAG, "可用內存---->>>" + mi.availMem / (1024 * 1024));
    return mi.availMem / (1024 * 1024);
}

}


作者:依然綠茶
來源:CSDN
原文:https://blog.csdn.net/whu_zhangmin/article/details/19123283
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

用指令開啟或關閉 SD 卡合併到內存

撰寫說明…

今天老婆說剛買沒多久的手機又滿了,不能裝東西,想說颱風天來幫她合併 SD 卡內存,這樣她又更能盡情裝 APP 了(?),結果系統一直顯示無法合併 (因為速度太慢),但是其實測速以後還好阿,因此用手動的方式來設定合併內存。

這篇有用的對象如下

  1. Android 6.0 以上設備
  2. 會開啟 adb 跟 debug 模式
  3. 不管 SD 卡的速度 (因為合併內存一定會降速度,很差的卡降更多)
  4. 合併內存功能被鎖起來,或是因為速度偵測而無法合併的都可以使用

合併內存

  1. 備份 SD 卡
  2. adb start-server
  3. adb shell sm list-volumes all [應該類似 public:179,32 mounted … 這樣,後面的 179,32 等會會用到]
  4. adb shell sm set-force-adoptable true
  5. adb shell sm partition disk:179,32 private [這步將會把 SD 卡合併到內存,包含格式化,等了很久才完成,這時候看手機應該看不到 SD 卡了]
  6. adb shell sm set-force-adoptable false
  7. adb shell sm list-volumes all [應該會變成 private:179,32 mounted … 這樣,原來的 public 不見了]
  8. 重開機
  9. 檢查一下,到內存那邊移轉資料,還原 SD 卡資料,完成

恢復成可攜式 SD 卡

  1. 備份 SD 卡
  2. adb start-server
  3. adb shell sm list-volumes all [看 ID,179,32]
  4. adb shell sm set-force-adoptable true
  5. adb shell sm partition disk:179,32 public [這步會把 SD 設為可攜式 SD 卡,包含格式化]
  6. adb shell sm set-force-adoptable false
  7. adb shell sm list-volumes all [應該會變到 public 裡]
  8. 重開機
  9. 檢查一下,還原 SD 卡資料,完成