編輯:關於Android編程
本文實例講述了Android編程實現系統重啟與關機的方法。分享給大家供大家參考,具體如下:
最近在做個東西,巧合碰到了sharedUserId 的問題,所以收集了一些資料,存存檔備份。
安裝在設備中的每一個apk文件,Android 給每個 APK 進程分配一個單獨的用戶空間,其 manifest 中的 userid 就是對應一個 Linux 用戶都會被分配到一個屬於自己的統一的 Linux 用戶 ID,並且為它創建一個沙箱,以防止影響其他應用程序(或者其他應用程序影響它)。
用戶 ID 在應用程序安裝到設備中時被分配,並且在這個設備中保持它的永久性。
通過 Shared User id 擁有同一個User id的多個APK可以配置成運行在同一個進程中.所以默認就是可以互相訪問任意數據. 也可以配置成運行成不同的進程,同時可以訪問其他APK的數據目錄下的數據庫和文件.就像訪問本程序的數據一樣.
對於一個 APK 來說,如果要使用某個共享 UID 的話,必須做三步:
1、在 Manifest 節點中增加 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節點中增加:
android:sharedUserId="android.uid.system"
然後在 Android.mk 中增加
LOCAL_CERTIFICATE := platform
可以參見Settings等。
系統中所有使用 android.uid.shared 作為共享 UID 的 APK,都會在 manifest 節點中增加
android:sharedUserId="android.uid.shared"
然後在 Android.mk 中增加
LOCAL_CERTIFICATE := shared
可以參見Launcher等
系統中所有使用 android.media 作為共享 UID 的 APK,都會在 manifest 節點中增加
android:sharedUserId="android.media"
然後在 Android.mk 中增加
LOCAL_CERTIFICATE := media
可以參見Gallery等。
另外,應用創建的任何文件都會被賦予應用的用戶標識,並且正常情況下不能被其他包訪問。
當通過 getSharedPreferences(String,int)、openFileOutput(String、int)或者 openOrCreate Database(String、int、SQLiteDatabase.CursorFactory)
創建一個新文件時,開發者可以同時或分別使用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系統中的一環。
應用程序的 Android.mk 中有一個 LOCAL_CERTIFICATE 字段,由它指定用哪個 key 簽名,未指定的默認用 testkey
在應用層如何通過代碼實現 Android 系統的重啟,分享給大家。
這篇文章是在 android 系統開發的基礎之上進行實踐的,所以如果你是純粹的 app 開發,可能要讓你失望了。
該代碼在真機上測試成功,在模擬器上面測試失敗。
在 linux 下面,重啟 pc,非 root 用戶需要執行 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); } /** * 發送廣播. * * @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入門之源碼開發基礎教程》)
如果編譯成功,在 /out/target/product/generic/system/app 目錄下面,會多一個 reboot.apk 文件。
6. 安裝 apk
該 apk 必須放到 system/app 下面,即 adb push reboot.apk /system/app
思考:
關機或者重啟,一個是發送廣播,一個是啟動 Activity。
通過查找相應的 action 或者 string 資源(如關機關鍵字)就可以找到對應的類。
我們知道,framwork 的 mk 文件、資源文件等都在:
/frameworks/base/core/res、frameworks/base/core/res/res
比如關機的那個 Activity 就是 ShutDownActiviy,其又調用 ShutdownThread.shutdown。
重啟的相關的類在 WatchDog.java(定義了相關的量), 其內部類 RebootRequestReceiver 是主要代碼。
繼續追蹤你就會了解整個流程了。
更多關於Android相關內容感興趣的讀者可查看本站專題:《Android開發入門與進階教程》、《Android多媒體操作技巧匯總(音頻,視頻,錄音等)》、《Android基本組件用法總結》、《Android視圖View技巧總結》、《Android布局layout技巧總結》及《Android控件用法總結》
希望本文所述對大家Android程序設計有所幫助。
什麼是Handler?handler是Android給我們提供用來更新UI的一套機制,也是一套消息處理機制.我們可以使用它發送消息,也可以通過它處理消息.我們為什麼要使用
現在的智能手機不敢說百分百的都是觸摸屏,也應該是百分之九九以上為觸摸屏了,觸摸屏為我們操作無鍵盤、無鼠標的手機系統帶來了很多的便利。當用戶觸摸屏幕時會產生很多的觸摸事件,
Android基於Linux2.6+內核,我們看一張圖,以對Android系統的架構有個感性的認識。 我們從Kernel層簡單說明: 1、
首先呈上效果圖當今APP,哪個沒有點滑動刷新功能,簡直就太落伍了。正因為需求多,因此自然而然開源的也就多。但是若想引用開源庫,則很麻煩,比如PullToRefreshVi