33

Novaはこれをどのように管理していますか?私は文字通りまったく同じことをしようとしています: 新しいデフォルトのランチャーをクリアして選択するために押すボタンをユーザーに提供します。

デフォルトのアプリ名を取得して表示できます。

       private String getPrefered(Intent i) {
       PackageManager pm = this.getActivity().getPackageManager();
       final ResolveInfo mInfo = pm.resolveActivity(i, 0);
       return (String) pm.getApplicationLabel(mInfo.activityInfo.applicationInfo);
   }

どこIntent iですか

Intent home = new Intent("android.intent.action.MAIN");
        home.addCategory("android.intent.category.HOME");

次に、システム ResolveActivity を呼び出します。

private void makePrefered() {
       Intent selector = new Intent("android.intent.action.MAIN");
       selector.addCategory("android.intent.category.HOME");                          
       selector.setComponent(new ComponentName("android", "com.android.internal.app.ResolverActivity"));
       startActivity(selector);
   }

ピッカーが表示され、正しく機能しますが、実際には値を設定またはクリアしません。それをデバッグしている間、私はいくつかの余分なものが欠けているように見えますか? メソッドを呼び出すとmakePrefered、次のログ メッセージが表示されます。

I/ActivityManager(  602): START {act=android.intent.action.MAIN cat=[android.intent.category.HOME] cmp=android/com.android.internal.app.ResolverActivity u=0} from pid 22641

Nova実装を使用すると、これらすべてが表示されますが、

    I/PackageManager(  602): Result set changed, dropping preferred activity for Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 (has extras) } type null
I/ActivityManager(  602): START {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 cmp=android/com.android.internal.app.ResolverActivity (has extras) u=0} from pid 22905
I/ActivityManager(  602): START {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 cmp=com.mycolorscreen.canvas/.Launcher (has extras) u=0} from pid 22905
  1. そこにアクセスして、そのバンドルと一緒に何が送られているかを確認するにはどうすればよいですか?
  2. 優先アプリをクリアするにはどうすればよいですか? できないなんて言わないでください、私はそれらの答えを十分に見てきました。Nova はそれを行い、まさに私がやりたいと思っている方法でそれを行います。
4

4 に答える 4

62

これを行うコードは、実際には非常に巧妙な回避策です。

を含むコンポーネントの場合

        <category android:name="android.intent.category.HOME" />

通常、新しいホーム アプリケーションをインストールすると、デフォルトのホーム アプリがクリアされます。

このようなホーム コンポーネントを使用して空のアクティビティを作成することで、これを利用します。

<activity
            android:name="com.t3hh4xx0r.haxlauncher.FakeHome"
            android:enabled="false">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.HOME" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>     

新しいデフォルトを設定する場合は、このコンポーネントを有効にしてから、ホーム インテントを呼び出してから、偽のホーム コンポーネントを再度無効にします。

public static void makePrefered(Context c) {
       PackageManager p = c.getPackageManager();
       ComponentName cN = new ComponentName(c, FakeHome.class);
       p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

       Intent selector = new Intent(Intent.ACTION_MAIN);
       selector.addCategory(Intent.CATEGORY_HOME);            
       c.startActivity(selector);

       p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
   }

最終的な結果として、システムは新しいホーム アプリがインストールされたと見なすため、デフォルトがクリアされ、特別な権限なしで自分のアプリを設定できるようになります。

これがどのように行われるかについての情報については、TeslaCoil と NovaLauncher の Kevin に感謝します!

于 2012-11-05T20:18:26.237 に答える
5

r2DoesInc のソリューションは、私の 4.2.2 テスト デバイスでは機能しません。
私の解決策:アプリの HomeActivity を無効にしてから再度有効にします。作成する必要はありませんFakeHome

PackageManager p = getPackageManager();
ComponentName cN = new ComponentName(this, HomeActivity.class);
p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
startActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME));
p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
于 2015-01-15T08:36:45.803 に答える