0

ユーザーが任意のタブ アクティビティからメールを送信できる TabHost アプリケーションがあります。Email インテントの起動を処理する任意のアクティビティからインスタンス化できる 1 つのクラスを作成したいと考えていますが、これが理想的な方法かどうかはわかりません。

コードの重複をいくらか節約できますが、createChooser() を起動する別のインテントを作成するインテントを作成する必要があるため、多くのオーバーヘッドが発生するようです。より良い方法はありますか?

アプリケーションコード

Intent send = new Intent (this, Email.class); 
send.putExtra ("mailto", EMAIL_ADDRESS); 
send.putExtra ("subject", SUBJECT); 
send.putExtra ("body", MSG_BODY); 
this.startActivity (send);

メールクラス

public class Email extends Activity
{
    @Override
    protected void onCreate (Bundle savedInstanceState)
    {
        super.onCreate (savedInstanceState);
        Log.d ("email" , " oncreate");

        Bundle ex = getIntent ().getExtras ();
        String mailto =  ex.getString ("mailto");
        String subject = ex.getString ("subject");
        String body = ex.getString ("body");

        if (body == null)
           body = "";
        if (subject == null)
           subject = "";

        try
        { 
            // use the builtin chooser for users mail app or SMS
            /* NOTE: AndroidManifest has android:noHistory="true" for this */
            Intent sendIntent = new Intent(android.content.Intent.ACTION_SEND);
            sendIntent.setType("text/plain");
            sendIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String [] {mailto});
            sendIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, subject);
            sendIntent.putExtra(android.content.Intent.EXTRA_TEXT, body);
            startActivityForResult (Intent.createChooser(sendIntent, "Send via which Application?"), 0);
        }
        catch (Exception e) 
        {
            Toast.makeText (this, "No activity was found to handle this action",Toast.LENGTH_SHORT).show();
        }
    }
}
4

2 に答える 2

1

Email インテントの起動を処理する任意のアクティビティからインスタンス化できる 1 つのクラスを作成したいと考えていますが、これが理想的な方法かどうかはわかりません。

あなたのコードは機能しないので、理想的な方法ではありません。

より良い方法はありますか?

静的メソッドを使用します。サブジェクトなどをパラメーターとしてメソッドに渡します。でメソッドを呼び出しstartActivity()ますACTION_SEND Intent(注: はで動作するように設計されていないためstartActivityForResult()、わざわざ を呼び出さないでください)。ACTION_SENDstartActivityForResult()

于 2012-07-27T18:46:22.637 に答える
0

結局のところ、これはかなり些細なことでした。スティッキーな部分は Context を渡し、そこからインテントを起動していました。それが他の誰かに役立つことを願っています。

package foo.test.email;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

    public class Email
    {

        public static void send (Context ctx, String addy, String subject, String body)
        {
            try
            {
                // use the builtin chooser for users 'send' app
                Intent sendIntent = new Intent(Intent.ACTION_SEND);
                sendIntent.setType("text/plain");

                sendIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String [] {addy});
                sendIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, subject);
                sendIntent.putExtra(android.content.Intent.EXTRA_TEXT, body);

                ctx.startActivity (Intent.createChooser(sendIntent, "Send via which Application?"));
            }
            catch (Exception e) 
            {
                Toast.makeText (ctx, "No activity was found to handle this action",Toast.LENGTH_SHORT).show();
            }
        }

    }

別のクラスから静的送信メソッドを呼び出すには:

Email.send (mainApp.this, "who@where", "a subject", "a body");
于 2012-07-30T18:28:05.397 に答える