我想知道Intent.ACTION_PRE_BOOT_COMPLETED
. 目前,我的要求是在设备启动完成之前完成任务,即在调用Intent.ACTION_BOOT_COMPLETED
. 谁能指导我如何继续满足要求?在这方面的任何帮助将不胜感激。
问问题
1944 次
2 回答
3
ACTION_PRE_BOOT_COMPLETED 在 ActivityManagerService.java::systemReady 中发送。
但是要接收它,您的应用程序的 uid 必须是 system(1000)。
for (int i=ris.size()-1; i>=0; i--) {
if ((ris.get(i).activityInfo.applicationInfo.flags
&ApplicationInfo.FLAG_SYSTEM) == 0) {
ris.remove(i);
}
}
此外,每次升级只能收到一次广播(这里不太确定,可能应该是每次擦除数据)。
注意下面的代码,如果目标在 lastDoneReceivers 中,它将被删除。
ArrayList<ComponentName> lastDoneReceivers = readLastDonePreBootReceivers();
final ArrayList<ComponentName> doneReceivers = new ArrayList<ComponentName>();
for (int i=0; i<ris.size(); i++) {
ActivityInfo ai = ris.get(i).activityInfo;
ComponentName comp = new ComponentName(ai.packageName, ai.name);
if (lastDoneReceivers.contains(comp)) {
ris.remove(i);
i--;
}
}
lastDoneReceivers 从文件 /data/system/called_pre_boots.dat 中读取。
private static File getCalledPreBootReceiversFile() {
File dataDir = Environment.getDataDirectory();
File systemDir = new File(dataDir, "system");
File fname = new File(systemDir, "called_pre_boots.dat");
return fname;
}
static final int LAST_DONE_VERSION = 10000;
private static ArrayList<ComponentName> readLastDonePreBootReceivers() {
ArrayList<ComponentName> lastDoneReceivers = new ArrayList<ComponentName>();
File file = getCalledPreBootReceiversFile();
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
DataInputStream dis = new DataInputStream(new BufferedInputStream(fis, 2048));
int fvers = dis.readInt();
if (fvers == LAST_DONE_VERSION) {
String vers = dis.readUTF();
String codename = dis.readUTF();
String build = dis.readUTF();
if (android.os.Build.VERSION.RELEASE.equals(vers)
&& android.os.Build.VERSION.CODENAME.equals(codename)
&& android.os.Build.VERSION.INCREMENTAL.equals(build)) {
int num = dis.readInt();
while (num > 0) {
num--;
String pkg = dis.readUTF();
String cls = dis.readUTF();
lastDoneReceivers.add(new ComponentName(pkg, cls));
}
}
}
} catch (FileNotFoundException e) {
} catch (IOException e) {
Slog.w(TAG, "Failure reading last done pre-boot receivers", e);
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
}
}
}
return lastDoneReceivers;
}
于 2015-01-24T08:47:25.683 回答
-2
没有 ACTION_PRE_BOOT_COMPLETED 这样的操作。我认为您通常无法满足您的要求。系统签名的应用程序可能有一些机制可以做到这一点。
于 2012-07-05T14:13:13.923 回答