2012-04-09 3 views
13

onOptionsItemSelected()の私の実装から呼び出された以下のスニペットは、電子メールアドレス、件名、本文があらかじめ入力されたメールクライアントにユーザーを持ち運ぶためにうまく機能します。私はこれをユーザーにフィードバックを与えるための簡単な方法として使用しています。なぜIntent.createChooser()はBroadcastReceiverを必要とし、どのように実装するのですか?

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:")); 

メールアプリは(アンドロイド4.0.4と私のネクサスS上で)開くと、LogCatは以下を出力し、私はその理由を把握することはできません。 GoogleとSOはを検索します。createChooser unregisterReceiverは役に立ちません。この状況を助ける方法でunregisterReceiver()とも呼ばれるcreateChooser()の多くの例が見つかりません。

4月8日21:26:19.094:E/ActivityThread(27894):アクティビティcom.android.internal.app.ChooserActivityはもともとIntentReceiver [email protected]を漏洩しましたここに登録。 unregisterReceiver()への呼び出しがありませんか?

4月8日21:26:19.094:E/ActivityThread(27894)は:android.app.IntentReceiverLeaked:活動com.android.internal.app.ChooserActivityはIntentReceiver com.android.internal.app.ResolverActivity $ @ 1を漏洩しました4150aac8は当初ここに登録されていました。 unregisterReceiver()への呼び出しがありませんか?

4月8日21:26:19.094:E/ActivityThread(27894):。android.app.LoadedApk $ ReceiverDispatcherで(LoadedApk.java:763)

ので、私のこれはAndroidのバグのように感じています自分のコードはregisterReceiver()と呼ばれないので、なぜAndroidはに電話する必要があると不平を言っているのですか?

+0

私は私のネクサスS 4.0.4 –

+0

んと同じ問題を抱えている、これはエミュレータで起こりますか?そうでない場合、[this](https://groups.google.com/forum/?fromgroups#!topic/android-developers/POS_LeIim_U)が関連している可能性があります。 – trutheality

答えて

11

ギャラクシーネクサス4.0.4ではこれも表示されていますが、オプションが1つしかなくても選択肢が表示されない場合にのみ表示されます。

これはAndroidソースのバグです。これはあまりできません。それらのResolverActivityはBroadcastReceiverを登録しますが、必ずしもそれを登録解除するわけではありません。

もっと詳しく:

Intent.createChooserは()ResolverActivityを開始します。 onCreate()において、活性は

mPackageMonitor.register(this, false); 

を呼び出しmPackageMonitorはBroadcastReceiverでありregister()内では活性に自身を登録します。通常、受信者はonStop()に登録されていません。ただし、onCreate()の後のコードでは、ユーザーが選択できるオプションの数が確認されます。 1つしかない場合は、finish()を呼び出します。 finish()onCreate()で呼び出されているので、他のライフサイクルメソッドは呼び出されず、そのままonDestroy()にジャンプします。

Androidの問題データベースでこのバグは表示されませんでした。したがって、created oneです。

詳細情報については、あなたのコードでこれを見ることができます:

は、Googleがあなたが望んでいないだろうというときの一例として電子メールを使用しています選択肢を使用して、意図をただちに開始することを検討してください。 Intent#ACTION_CHOOSERのjavadocsを参照してください。

+0

あなたは電子メールの選択を使用しないと言っているGoogleのリンクリファレンスを持っていますか? – Blundell

+0

Intent#ACTION_CHOOSERのjavadocにあります。上記のリンクを使用するか、Eclipseで見ることができます。 – blazeroni

+1

参考までに、このオプションの数に関係なく、Android 4.4ではこれが起こっているようです。インテントタイプを「text/html」に変更すると役立ちますが、実際に共有できるアプリの数も制限されます。 Android 4.4がこれを引き起こしている理由は何ですか? – clu

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); 
} 
関連する問題