欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

輕松簡單實現(xiàn)Android設(shè)備重啟的兩種方式 - 新聞資訊 - 云南小程序開發(fā)|云南軟件開發(fā)|云南網(wǎng)站建設(shè)-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設(shè)/小程序開發(fā)/軟件開發(fā)

知識

不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側(cè)重于功能的便捷,營銷的便利,運(yùn)營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!

您當(dāng)前位置>首頁 » 新聞資訊 » 技術(shù)分享 >

輕松簡單實現(xiàn)Android設(shè)備重啟的兩種方式

發(fā)表時間:2020-10-18

發(fā)布人:葵宇科技

瀏覽次數(shù):82

" 須知少時凌云志,曾許人間第一流 "
在《風(fēng)犬少年的天空》中劉聞欽下線時,嘴里念叨的就是這句,我們何嘗不是這樣的人呢,年輕時的凌云大志,曾決心要做人間第一流的人物,干出人間第一流的成績,但歲月蹉跎,依舊名利雙無收。

前言

本文重點講述如何實現(xiàn)Android設(shè)備重啟,這里的Android設(shè)備可不是我們用的手機(jī)哦,畢竟現(xiàn)在的手機(jī)越來越高級,好像除了蘋果系列的手機(jī)沒有定時開關(guān)機(jī),Android手機(jī)都是有這個功能的,有的人喜歡睡前關(guān)機(jī),早上四五點就定時開機(jī),覺得這樣手機(jī)用起來才不會卡,當(dāng)然這只是一小部分人的做法,好多人都是直接通宵玩手機(jī)的,玩到?jīng)]電就充電睡覺去。
好了,再說就跑題了,哈哈 ~~
進(jìn)入正題,為什么需要重啟Android設(shè)備呢?因為現(xiàn)在好多生產(chǎn)安卓板的廠家用的Android系統(tǒng)大部分是閹割版的,自身硬件和服務(wù)需要用到什么功能就放進(jìn)去,沒用到的就切掉,但是有些廠家對于這一塊處理得不夠好,導(dǎo)致系統(tǒng)長時間運(yùn)行時,會出現(xiàn)不穩(wěn)定情況,例如Android板長時間運(yùn)行一款app的,比如廣告投放機(jī)、自動售賣機(jī)等,如果本身配置不夠高,系統(tǒng)做的又不好,就會出現(xiàn)卡死,黑屏或者卡屏閃屏問題出現(xiàn),只要硬件沒壞,只需要重啟下Android系統(tǒng)就可以解決上述問題的。

一、利用系統(tǒng)廣播ACTION_REBOOT

這種方式非常簡單,只需要發(fā)送一個系統(tǒng)廣播ACTION_REBOOT,代碼如下:

       mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent reboot = new Intent(Intent.ACTION_REBOOT);
                reboot.putExtra("nowait", 1);
                reboot.putExtra("interval", 1);
                reboot.putExtra("window", 0);
                sendBroadcast(reboot);
            }
        });

但是這樣是不會重啟的,程序還會因此閃退,直接報錯:


    com.xz.android72test E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.xz.android72test, PID: 3180
    java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.REBOOT from pid=3180, uid=10046
        at android.os.Parcel.readException(Parcel.java:1546)
        at android.os.Parcel.readException(Parcel.java:1499)
        at android.app.ActivityManagerProxy.broadcastIntent(ActivityManagerNative.java:2831)
        at android.app.ContextImpl.sendBroadcast(ContextImpl.java:1331)
        at android.content.ContextWrapper.sendBroadcast(ContextWrapper.java:377)
        at com.xz.android72test.MainActivity$2.onClick(MainActivity.java:115)
        at android.view.View.performClick(View.java:4780)
        at android.view.View$PerformClick.run(View.java:19866)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5293)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

最主要的錯誤是SecurityException: Permission Denial,權(quán)限不夠,默認(rèn)的SDK并沒有提供應(yīng)用開發(fā)者直接的Android系統(tǒng)關(guān)機(jī)或重啟的API接口,一般來講,實現(xiàn)Android系統(tǒng)的關(guān)機(jī)或重啟,需要較高的權(quán)限(系統(tǒng)權(quán)限甚至Root權(quán)限),在此,我們需要將app的權(quán)限提高至系統(tǒng)權(quán)限,找到AndroidManifest.xml,添加下面的代碼:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.xz.android72test" android:sharedUserId="android.uid.system">
     ..........
</manifest>

但是做到這里也是不會重啟的,程序還會安裝失敗,直接報錯:


Installation did not succeed.
The application could not be installed: INSTALL_FAILED_SHARED_USER_INCOMPATIBLE
Installation failed due to: 'null'

這是為什么呢? 因為這個apk沒有這個系統(tǒng)的簽名。如何簽名呢?

有三種方式:

第一種,這種方式比較經(jīng)典傳統(tǒng):

  • 聯(lián)系安卓板廠家技術(shù)獲取主板系統(tǒng)的簽名文件platform.pk8platform.x509.pem,每家安卓板廠家簽名文件都不一樣,還需要signapk.jar這個文件,一般廠家也會將這個文件一起發(fā)送過來,網(wǎng)上也是可以下載的,jar包里面帶有簽名的程序。
  • 在windows下,啟動cmd.exe,進(jìn)入命令行模式,通過cd C:\Users\Administrator\Desktop\signapkApp進(jìn)到帶有platform.pk8platform.x509.pemsignapk.jar文件的文件夾。
  • 最后輸入下面命令進(jìn)行簽名:
java -jar signapk.jar  platform.x509.pem platform.pk8 C:\Users\Administrator\Desktop\signapkApp\app-release.apk signed_app-release.apk

其中C:\Users\Administrator\Desktop\signapk.jar\app-release.apk為需要簽名的apk路徑,signed_app-release.apk是簽名之后的apk,跟未簽名的apk在同一個目錄下。

最后直接通過adb push或者adb install把這個signed_app-release.apk安裝完即可實現(xiàn)重啟了。

第二種,這種方式跟第一種比較,更加簡單,也可以在debug版本或者release版本進(jìn)行簽名:
只需要問安卓板廠家技術(shù)要一個文件,或者自己根據(jù)主板系統(tǒng)的簽名文件platform.pk8platform.x509.pem做一個出來,這個文件就是platform.keystore簽名文件。

然后在app\build.gradle文件下添加下面代碼:

android {

    ......
    
    signingConfigs {
        debug {
            storeFile file('platform.keystore文件路徑')
            storePassword 'keystore的密碼'
            keyAlias '密鑰別名'
            keyPassword '密鑰密碼'
        }
        release {
            storeFile file('platform.keystore文件路徑')
            storePassword 'keystore的密碼'
            keyAlias '密鑰別名'
            keyPassword '密鑰密碼'
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
        debug {
            signingConfig signingConfigs.debug
        }
    }
}

至此,Build出來的apk無論是debug還是release版本都帶有系統(tǒng)簽名的。

第三種,這種方式基本算是白嫖了,利用廠家提供的簽名網(wǎng)站,只需要將未簽名的apk上傳到他們服務(wù)器,過一會簽完名之后會自動下載下來,而這個文件就是已經(jīng)簽完名了。
在這里插入圖片描述
對比這三種方式,是不是最后這一種最省事呢?但是吶,人還是不可以太懶的,建議用第二種方式啦。

二、利用Linux-shell發(fā)送reboot指令

這種方式非常簡單,利用Runtime這個Java類可以直接調(diào)用并執(zhí)行shell命令,直接貼代碼:


       mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                exec("reboot");
            }
        });
        

如果Android設(shè)備沒有root過,需要在AndroidManifest.xml下添加一下權(quán)限,從而使下面代碼獲取管理員權(quán)限:

<uses-permission android:name="android.permission.ACCESS_SUPERUSER" />

exec方法:

    private String exec(String command) {

        Process process = null;
        BufferedReader reader = null;
        InputStreamReader is = null;
        DataOutputStream os = null;

        try {
            process = Runtime.getRuntime().exec("su");
            is = new InputStreamReader(process.getInputStream());
            reader = new BufferedReader(is);
            os = new DataOutputStream(process.getOutputStream());
            os.writeBytes(command + "\n");
            os.writeBytes("exit\n");
            os.flush();
            int read;
            char[] buffer = new char[4096];
            StringBuilder output = new StringBuilder();
            while ((read = reader.read(buffer)) > 0) {
                output.append(buffer, 0, read);
            }
            process.waitFor();
            return output.toString();
        } catch (IOException | InterruptedException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if (os != null) {
                    os.close();
                }

                if (is != null) {
                    is.close();
                }

                if (reader != null) {
                    reader.close();
                }

                if (process != null) {
                    process.destroy();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

普通用戶是沒有權(quán)限執(zhí)行reboot,所以使用的Android設(shè)備最好是root過的,不然會在獲取su管理員權(quán)限時,出現(xiàn)一個彈窗詢問你是否允許請求超級用戶訪問權(quán)限,非常影響用戶體驗。

在這里插入圖片描述

非常感謝你能看到這里,如果能夠幫助到你是我的榮幸!

相關(guān)案例查看更多