知識
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側(cè)重于功能的便捷,營銷的便利,運(yùn)營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!
輕松簡單實現(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.pk8
與platform.x509.pem
,每家安卓板廠家簽名文件都不一樣,還需要signapk.jar
這個文件,一般廠家也會將這個文件一起發(fā)送過來,網(wǎng)上也是可以下載的,jar包里面帶有簽名的程序。 - 在windows下,啟動cmd.exe,進(jìn)入命令行模式,通過
cd C:\Users\Administrator\Desktop\signapkApp
進(jìn)到帶有platform.pk8
、platform.x509.pem
和signapk.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.pk8
與 platform.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)案例查看更多
相關(guān)閱讀
- 網(wǎng)站排名
- 汽車報廢系統(tǒng)
- 英文網(wǎng)站建設(shè)公司
- 麗江小程序開發(fā)
- 云南網(wǎng)站建設(shè)高手
- 報廢車拆解回收管理系統(tǒng)
- 網(wǎng)站建設(shè)報價
- 花農(nóng)小程序
- 汽車回收系統(tǒng)
- 大理小程序開發(fā)
- 怎么做網(wǎng)站
- 云南網(wǎng)站建設(shè)公司地址
- 做網(wǎng)站
- 網(wǎng)站建設(shè)優(yōu)化
- 昆明網(wǎng)站開發(fā)
- 昆明小程序公司
- 網(wǎng)站制作哪家好
- 小程序技術(shù)
- 小程序公司
- 云南做百度小程序的公司
- 云南網(wǎng)站開發(fā)
- 網(wǎng)站建設(shè)公司地址
- 二叉樹
- 網(wǎng)站小程序
- 云南網(wǎng)站建設(shè)報價
- 紅河小程序開發(fā)
- web教程
- 云南網(wǎng)站建設(shè)哪家公司好
- 用戶登錄
- 網(wǎng)站建設(shè)需要多少錢