13

の実装から呼び出された次のスニペットはonOptionsItemSelected()、ユーザーをアプリからメールアドレス、件名、本文が事前に入力されたメールクライアントに移動するためにうまく機能します。私はこれを、ユーザーがフィードバックをくれるようにする簡単な方法として使用しています。

String uriText =
    "mailto:" + emailAddress +
    "?subject=" + subject +
    "&body=" + body;

Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse(uriText));
startActivity(Intent.createChooser(emailIntent, "Pick an email app:"));

メールアプリを開くと(Android4.0.4を搭載したNexusSで)、LogCatは次のように出力しますが、その理由がわかりません。GoogleとSOがcreateChooserunregisterReceiverを検索しても効果がないようですが、この状況に役立つ方法でcreateChooser()呼び出しを行う例は多くありません。unregisterReceiver()

04-08 21:26:19.094:E / ActivityThread(27894):アクティビティcom.android.internal.app.ChooserActivityが、最初にここに登録されたIntentReceiver com.android.internal.app.ResolverActivity $ 1@4150aac8をリークしました。unregisterReceiver()の呼び出しがありませんか?

04-08 21:26:19.094:E / ActivityThread(27894):android.app.IntentReceiverLeaked:アクティビティcom.android.internal.app.ChooserActivityが元々あったIntentReceiver com.android.internal.app.ResolverActivity $ 1@4150aac8をリークしましたここに登録しました。unregisterReceiver()の呼び出しがありませんか?

04-08 21:26:19.094:E / ActivityThread(27894):android.app.LoadedApk $ ReceiverDispatcher。(LoadedApk.java:763)

私自身のコードが呼び出さないため、これはAndroidのバグのように感じますがregisterReceiver()、なぜAndroidは私が呼び出す必要があると不平を言っているのunregisterReceiver()ですか?

4

2 に答える 2

11

これは4.0.4のGalaxyNexusでも見られますが、オプションが1つしかなく、チューザーが表示されない場合に限ります。

これはAndroidソースのバグです-それについてできることはあまりありません。彼らのResolverActivityはBroadcastReceiverを登録しますが、常に登録を解除するとは限りません。

より詳しく:

Intent.createChooser()はResolverActivityを開始します。onCreate()では、アクティビティは

mPackageMonitor.register(this, false);

mPackageMonitorはBroadcastReceiverであり、その中register()でアクティビティに登録されます。通常、受信者はで登録解除されonStop()ます。ただし、onCreate()コードの後半で、ユーザーが選択できるオプションの数を確認します。1つしかない場合は、を呼び出しますfinish()finish()他のライフサイクルで呼び出されるため、メソッドが呼び出されることはなく、レシーバーのリークにonCreate()直接ジャンプします。onDestroy()

Androidの問題データベースでこのバグは見られなかったので、作成しました

詳細については、コードでこれを見ることができます:

ちなみに、Googleはチューザーを使用したくない場合の例としてメールを使用しているため、通常どおりインテントを起動することを検討してください。Intent#ACTION_CHOOSERについては、javadocsを参照してください。

于 2012-04-24T01:13:15.830 に答える
4

問題の簡単な解決。

詳細はこちら:https ://developer.android.com/training/basics/intents/sending.html

Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);

PackageManager pkManager = getPackageManager();
List<ResolveInfo> activities = pkManager.queryIntentActivities(mapIntent, 0);

if (activities.size() > 1) {
    // Create and start the chooser
    Intent chooser = Intent.createChooser(mapIntent, "Open with");
    startActivity(chooser);

  } else {
    startActivity( mapIntent );
}
于 2013-01-02T10:28:19.750 に答える