欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android編程實現系統重啟與關機的方法

 更新時間:2016年02月24日 10:32:01   作者:炫_愛羊  
這篇文章主要介紹了Android編程實現系統重啟與關機的方法,較為詳細的分析了Android運行原理與源碼剖析,講述了Android編程實現系統重啟與關機的相關技巧與注意事項,需要的朋友可以參考下

本文實例講述了Android編程實現系統重啟與關機的方法。分享給大家供大家參考,具體如下:

最近在做個東西,巧合碰到了sharedUserId 的問題,所以收集了一些資料,存存檔備份。

安裝在設備中的每一個apk文件,Android 給每個 APK 進程分配一個單獨的用戶空間,其 manifest 中的 userid 就是對應一個 Linux 用戶都會被分配到一個屬于自己的統一的 Linux 用戶 ID,并且為它創(chuàng)建一個沙箱,以防止影響其他應用程序(或者其他應用程序影響它)。

用戶 ID 在應用程序安裝到設備中時被分配,并且在這個設備中保持它的永久性。

通過 Shared User id 擁有同一個User id的多個APK可以配置成運行在同一個進程中.所以默認就是可以互相訪問任意數據. 也可以配置成運行成不同的進程,同時可以訪問其他APK的數據目錄下的數據庫和文件.就像訪問本程序的數據一樣.
對于一個 APK 來說,如果要使用某個共享 UID 的話,必須做三步:

1、在 Manifest 節(jié)點中增加 android:sharedUserId 屬性。

2、在 Android.mk 中增加 LOCAL_CERTIFICATE 的定義。

如果增加了上面的屬性但沒有定義與之對應的 LOCAL_CERTIFICATE 的話,APK是安裝不上去的。

提示錯誤是:

Package com.test.MyTest has no signatures that match those in shared user android.uid.system; ignoring!

也就是說,僅有相同簽名和相同 sharedUserID 標簽的兩個應用程序簽名都會被分配相同的用戶ID。

例如所有和 media/download 相關的 APK 都使用 android.media 作為 sharedUserId 的話,那么它們必須有相同的簽名 media。

3、把 APK 的源碼放到 packages/apps/ 目錄下,用 mm 進行編譯。

舉例說明一下。

系統中所有使用android.uid.system作為共享UID的APK,都會首先在manifest節(jié)點中增加:

android:sharedUserId="android.uid.system"

然后在 Android.mk 中增加

LOCAL_CERTIFICATE := platform

可以參見Settings等。

系統中所有使用 android.uid.shared 作為共享 UID 的 APK,都會在 manifest 節(jié)點中增加

android:sharedUserId="android.uid.shared"

然后在 Android.mk 中增加

LOCAL_CERTIFICATE := shared

可以參見Launcher等

系統中所有使用 android.media 作為共享 UID 的 APK,都會在 manifest 節(jié)點中增加

android:sharedUserId="android.media"

然后在 Android.mk 中增加

LOCAL_CERTIFICATE := media

可以參見Gallery等。

另外,應用創(chuàng)建的任何文件都會被賦予應用的用戶標識,并且正常情況下不能被其他包訪問。

當通過 getSharedPreferences(String,int)、openFileOutput(String、int)或者 openOrCreate Database(String、int、SQLiteDatabase.CursorFactory)

創(chuàng)建一個新文件時,開發(fā)者可以同時或分別使用MODE_WORLD_READABLE 和MODE_WORLD_RITEABLE 標志允許其他包讀/寫此文件。當設置了這些標志后,這個文件仍然屬于自己的應用程序,但是它的全局讀/寫和讀/寫權限已經設置,所以其他任何應用程序可以看到它。

關于簽名

build/target/product/security 目錄中有四組默認簽名供 Android.mk 在編譯APK使用:

1、testkey:  普通 APK,默認情況下使用。

2、platform:該 APK 完成一些系統的核心功能。經過對系統中存在的文件夾的訪問測試,這種方式編譯出來的 APK 所在進程的 UID 為 system。

3、shared:   該APK需要和home/contacts進程共享數據。

4、media:該APK是media/download系統中的一環(huán)。

應用程序的 Android.mk 中有一個 LOCAL_CERTIFICATE 字段,由它指定用哪個 key 簽名,未指定的默認用 testkey
 
在應用層如何通過代碼實現 Android 系統的重啟,分享給大家。

這篇文章是在 android 系統開發(fā)的基礎之上進行實踐的,所以如果你是純粹的 app 開發(fā),可能要讓你失望了。

該代碼在真機上測試成功,在模擬器上面測試失敗。

在 linux 下面,重啟 pc,非 root 用戶需要執(zhí)行 sudo reboot,所以在 android 下重啟機器也需要一定的權限。

應用程序界面:
 
1. 新建一個 android 工程 reboot
 
2. 編寫 Android.mk

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := reboot
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)
# Use the folloing include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))

具體含義可自行查閱資料。注意:

LOCAL_CERTIFICATE := platform

3. 編寫補充 AndroidMenifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="mark.zhang"
  android:versionCode="1"
  android:versionName="1.0" >
<uses-sdk android:minSdkVersion="7" />
<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:sharedUserId="android.uid.system" >
<activity
      android:label="@string/app_name"
      android:name=".RebootActivity" >
      <intent-filter >
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
</application>
</manifest>

注意:

android:sharedUserId="android.uid.system"

4. 編寫邏輯代碼 RebootActivity.java

package mark.zhang;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class RebootActivity extends Activity {
  // 是否顯示關機確認的對話框
  // false 不顯示確認關機的對話框,直接關機
  // true 顯示確認關機的對話框,讓用戶選擇是否確認關機
  public static final boolean showShutdownDialog = false;
@Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
  }
/**
   * 發(fā)送廣播.
   *
   * @param view
   */
  public void onReboot(View view)
  {
    Intent reboot = new Intent(Intent.ACTION_REBOOT);
    reboot.putExtra("nowait", 1);
    reboot.putExtra("interval", 1);
    reboot.putExtra("window", 0);
    sendBroadcast(reboot);
  }
/**
   * 啟動 Activity.
   *
   * @param view
   */
  public void onShutdown(View view)
  {
    public void onShutdown(View view)
   {
    Intent shutdown = new Intent(Intent.ACTION_REQUEST_SHUTDOWN);
    shutdown.putExtra(Intent.EXTRA_KEY_CONFIRM, showShutdownDialog);
    shutdown.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(shutdown);
   }
  }
}

注意:

Intent.ACTION_REQUEST_SHUTDOWN
Intent.EXTRA_KEY_CONFIRM

會報錯,這是因為該屬性是  {@hide} 的。
不要擔心放到系統編譯就可以了,注意下面的步驟即可。

5. 將整個工程放到 android 源碼里面編譯

a. 手動復制 reboot 到 src/packages/app 下面

b. mm -j4 開始編譯(可以參考 《Android入門之源碼開發(fā)基礎教程》)

如果編譯成功,在 /out/target/product/generic/system/app 目錄下面,會多一個 reboot.apk 文件。

6. 安裝 apk

該 apk 必須放到 system/app 下面,即 adb push reboot.apk /system/app

思考

關機或者重啟,一個是發(fā)送廣播,一個是啟動 Activity。
通過查找相應的 action 或者 string 資源(如關機關鍵字)就可以找到對應的類。
我們知道,framwork 的 mk 文件、資源文件等都在:
/frameworks/base/core/res、frameworks/base/core/res/res
比如關機的那個 Activity 就是 ShutDownActiviy,其又調用 ShutdownThread.shutdown。
重啟的相關的類在 WatchDog.java(定義了相關的量), 其內部類 RebootRequestReceiver 是主要代碼。
繼續(xù)追蹤你就會了解整個流程了。

更多關于Android相關內容感興趣的讀者可查看本站專題:《Android開發(fā)入門與進階教程》、《Android多媒體操作技巧匯總(音頻,視頻,錄音等)》、《Android基本組件用法總結》、《Android視圖View技巧總結》、《Android布局layout技巧總結》及《Android控件用法總結

希望本文所述對大家Android程序設計有所幫助。

相關文章

  • Android自定義ViewGroup之WaterfallLayout(二)

    Android自定義ViewGroup之WaterfallLayout(二)

    這篇文章主要為大家詳細介紹了Android自定義ViewGroup之WaterfallLayout,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Android AndFix熱修復原理詳情

    Android AndFix熱修復原理詳情

    這篇文章主要介紹了Android AndFix熱修復原理詳情,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值嗎,需要的小伙伴可以參考一下
    2022-08-08
  • Android動畫學習筆記之補間動畫

    Android動畫學習筆記之補間動畫

    這篇文章主要為大家詳細介紹了Android動畫學習筆記之補間動畫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Android中使用ZXing生成二維碼(支持添加Logo圖案)

    Android中使用ZXing生成二維碼(支持添加Logo圖案)

    ZXing是谷歌的一個開源庫,可以用來生成二維碼、掃描二維碼。接下來通過本文給大家介紹Android中使用ZXing生成二維碼(支持添加Logo圖案),需要的朋友參考下
    2017-01-01
  • Android自定義單例AlertDialog詳解

    Android自定義單例AlertDialog詳解

    這篇文章主要為大家詳細介紹了Android自定義單例AlertDialog的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Flutter定義tabbar底部導航路由跳轉的方法

    Flutter定義tabbar底部導航路由跳轉的方法

    這篇文章主要為大家詳細介紹了Flutter定義tabbar底部導航路由跳轉的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Android 使用 RxJava2 實現倒計時功能的示例代碼

    Android 使用 RxJava2 實現倒計時功能的示例代碼

    本篇文章主要介紹了Android 使用 RxJava2 實現倒計時功能的示例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • Android實現從本地圖庫/相機拍照后裁剪圖片并設置頭像

    Android實現從本地圖庫/相機拍照后裁剪圖片并設置頭像

    玩qq或者是微信的盆友都知道,這些聊天工具里都要設置頭像,一般情況下大家的解決辦法是從本地圖庫選擇圖片或是從相機拍照,然后根據自己的喜愛截取圖片,接下來通過本文給大家介紹Android實現從本地圖庫/相機拍照后裁剪圖片并設置頭像,需要的朋友參考下
    2016-02-02
  • Android界面切換出現短暫黑屏的解決方法

    Android界面切換出現短暫黑屏的解決方法

    這篇文章主要介紹了Android界面切換出現短暫黑屏的解決方法,本文講解的是一個取巧方法,需要的朋友可以參考下
    2015-04-04
  • Android View教程之自定義驗證碼輸入框效果

    Android View教程之自定義驗證碼輸入框效果

    這篇文章主要給大家介紹了關于Android View教程之自定義驗證碼輸入框效果的相關資料,文中通過示例代碼介紹的非常詳細,對各位Android開發(fā)者們具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05

最新評論