0

の正確な機能を知りたいIntent.ACTION_PRE_BOOT_COMPLETED。現在、私の要件は、デバイスの起動が完了する前に、つまり の呼び出しの前にタスクを完了することですIntent.ACTION_BOOT_COMPLETED。要件を満たす方法を教えてもらえますか? この点でどんな助けでも大歓迎です。

4

2 に答える 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);
                    }
                }

さらに、このブロードキャストはアップグレードごとに 1 回しか受信できませんでした (ここではよくわかりませんが、データを消去するたびに受信する必要があります)。

以下のコードに注意してください。ターゲットが 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 に答える