0

シナリオ: 事前メモ: 有名な携帯電話やタブレットのメーカーが行っているように、カスタマイズされた Android ビルドを顧客に提供したいと考えています。

たとえば、android sys は、AndroidManifest.xml でインテント フィルター カテゴリ タグ「android.intent.category.default」でフラグが付けられた電子メール アプリを提供します。私たちが別のはるかにクールで驚くべきものを開発したと信じてください;-)メールアプリを開発し、マニフェストで「android.intent.category.default」intent.filterカテゴリも宣言しました。もちろん、常に使用するアプリの選択画面に関しては、アプリをデフォルトとして設定します。もちろん、ユーザーはアプリ設定のデフォルトをクリアすることはなく、常に地球上で最高のメール アプリを使用します :-)。

ユーザーは、工場出荷時の状態に完全にリセットすることを決定しました。次回ユーザーがメール アプリを起動すると、続行するメール アプリを選択するための「選択オーバーレイ」が表示されます。

デバイスの起動時にメール アプリをデフォルトとして設定することで、この選択画面を省略するにはどうすればよいですか? Androidは、以前に選択されたデフォルトのアプリ設定をどこに保存しますか?

考えられる 1 つの方法は、Android の既定のメール アプリ マニフェストから既定のカテゴリのインテント フィルターを削除することです。私たちはこれをしたくありません。

4

3 に答える 3

0

このオプションが必要かもしれないと思います:

アンドロイド:優先度="2"

<intent-filter android:priority="2">
    <action android:name="xxxxxxxxxxxxxxxxxx" />
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

アプリケーションのような「スタートアップウィザード」で見つけることができます。たとえば、GoogleServiceFramework.apk のものは GMS パッケージに付属しています。このインテント フィルターにより、ウィザード アプリケーションがホーム画面アプリケーション (ランチャー) を支配し、出荷時設定にリセットした後、ホーム画面の前に開始されたことがわかります。ユーザーは、インテント「ホーム」に対して実行するアクションを選択する必要はありません。ウィザードが終了すると、ウィザード自体が無効になり、ホーム画面が表示されます。

http://developer.android.com/guide/topics/manifest/intent-filter-element.html#priorityを参照してください。

フィルターによって記述されたタイプのインテントの処理に関して、親コンポーネントに与えられるべき優先度。この属性は、アクティビティとブロードキャスト レシーバーの両方にとって意味があります。これは、フィルタに一致するインテントにアクティビティがどの程度応答できるかについての情報を、インテントに応答する可能性のある他のアクティビティと比較して提供します。インテントが優先度の異なる複数のアクティビティによって処理される可能性がある場合、Android は優先度の値がより高いアクティビティのみをインテントの潜在的なターゲットと見なします。これは、ブロードキャスト メッセージを受信するためにブロードキャスト レシーバが実行される順序を制御します。優先度の値が高いものは、値が低いものより先に呼び出されます。(順序は同期メッセージにのみ適用されます。非同期メッセージでは無視されます。

値は、「100」などの整数である必要があります。数値が大きいほど優先度が高くなります。デフォルト値は 0 です。値は -1000 より大きく、1000 未満でなければなりません。

于 2013-08-26T07:12:50.147 に答える
0

logcat の出力:
1) 新しいホーム画面がアクティブになり、ボタンを押して (意図的に) Launcher2 を開くと、Launcher2 が開きます。

W/AudioPolicyManagerBase(  129): getDeviceForStrategy() unknown strategy: 6
D/dalvikvm( 1436): GC_CONCURRENT freed 180K, 6% free 5535K/5868K, paused 1ms+3ms, total 30ms
D/dalvikvm( 1436): WAIT_FOR_CONCURRENT_GC blocked 25ms
D/dalvikvm( 1436): GC_CONCURRENT freed 295K, 8% free 5722K/6168K, paused 5ms+6ms, total 39ms
D/libEGL  ( 1436): loaded /system/lib/egl/libEGL_tegra.so
D/libEGL  ( 1436): loaded /system/lib/egl/libGLESv1_CM_tegra.so
D/libEGL  ( 1436): loaded /system/lib/egl/libGLESv2_tegra.so
D/OpenGLRenderer( 1436): Enabling debug mode 0
D/dalvikvm( 1436): GC_CONCURRENT freed 208K, 6% free 5967K/6324K, paused 3ms+3ms, total 28ms
I/ActivityManager(  486): Displayed com.android.launcher/com.android.launcher2.Launcher: +653ms
D/dalvikvm( 1436): GC_CONCURRENT freed 247K, 8% free 6145K/6612K, paused 6ms+2ms, total 36ms
D/dalvikvm( 1436): WAIT_FOR_CONCURRENT_GC blocked 6ms
D/dalvikvm( 1436): GC_FOR_ALLOC freed 250K, 8% free 6254K/6780K, paused 31ms, total 31ms
I/dalvikvm-heap( 1436): Grow heap (frag case) to 7.235MB for 313616-byte allocation
D/dalvikvm( 1436): GC_CONCURRENT freed 147K, 7% free 6696K/7160K, paused 3ms+2ms, total 27ms

2)Launcher2または他のアプリがアクティブなときに「ホーム」ボタンを押します:

W/AudioPolicyManagerBase(  129): getDeviceForStrategy() unknown strategy: 6
W/AudioPolicyManagerBase(  129): getDeviceForStrategy() unknown strategy: 6
于 2013-08-28T11:13:52.900 に答える
0

もう一度始めましょう.... その優先プロパティで少し遊んでみました。

マニフェストに次のアクティビティ スニペットを持つ新しいホームスクリーン アプリを作成しました。

<activity 
 android:name="com.example.homescreen.HomescreenActivity"
 android:launchMode="singleInstance" 
 android:screenOrientation="landscape" > 
 <intent-filter android:priority="2" >
   <action android:name="android.intent.action.MAIN" /> 
   <category android:name="android.intent.category.HOME" /> 
   <category android:name="android.intent.category.DEFAULT" /> 
 </intent-filter>
</activity>

Androids Launcher2 の <intent-filter> 部分は「priority 属性」以外は同じです。

シナリオ 1:
新しいホーム画面をホーム画面の既定のアプリとして設定しました。次に、起動後にデフォルトのホーム画面を再度設定する必要があるかどうかを確認するために、工場出荷時の状態に完全にリセットします。
UI に、Launcher2 を開始するインテントを送信する 1 つのボタンがあります。Android の Launcher2 が正常に起動した後、[ホーム] ボタン (ハードウェア キー) を押しました。または、Launcher2 のアプリ グリッドからアプリを起動し、[ホーム] ボタンを押します。
結果: 「ホーム」は効果がなく、アプリも終了せず、Launcher2 も新しいホーム画面アプリに戻りません。

シナリオ 2:
新しいホーム画面アプリで優先度属性を使用しませんが、Android が新しいホーム画面が追加/ダウンロードされたことを検出すると、最初にこのアプリをデフォルトのランチャーとして設定します。
ここで、ファイルシステムをチェックすると: /data/system/users/0/package-restrictions.xml、この xml には、新しいホーム画面アプリで満たされた次のタグがあります。

<preferred-activities>
  <item name="com.example.homescreen/.HomescreenActivity" match="100000" set="2">
    <set name="com.example.homescreen/.HomescreenActivity" />
    <set name="com.android.launcher/com.android.launcher2.Launcher" />
    <filter>
      <action name="android.intent.action.MAIN" />
      <cat name="android.intent.category.HOME" />
      <cat name="android.intent.category.DEFAULT" />
    </filter>
  </item>
</preferred-activities>

以前と同じ手順を続けてファクトリー リセットを実行すると、デフォルトのホーム画面を再度設定する必要があります。しかし、そうして「ホーム」ボタンを押すと、常に新しいホーム画面アプリに戻ります。また、シナリオ 1 で、なぜ空の

<preferred-activities/>

この package-restrictions ファイルのタグ。この優先度により、そのようなエントリが自動的に追加される可能性があると思いました。

したがって、私がアーカイブしたいのは、完全にリセットして、次回はデフォルトのホーム画面アプリを選択する必要がないことです.
ホーム画面ランチャーアプリではない他のアプリについても同じことが言えます。

于 2013-08-27T17:52:57.133 に答える