0

[共有]メニューにあるアプリを作成したい(ウェブ上で見つけたものへのリンクをすばやくメールで送信したり、RSSリーダーで確認したりするため)このために、intent.action.SENDを使用してアプリを宣言しています。インテントフィルター:

    <activity
        android:name="uk.co.baroquedub.checkit.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.SEND" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="text/plain" />
           </intent-filter>
    </activity>

これがMainActivityパッケージのスケルトンです

package uk.co.baroquedub.testcheck;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;

import android.widget.Toast;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

// real code here grabs URL from intent then emails it as an asyncTask:
    doSendTask task = new doSendTask();
    task.execute(new String[] { "urlString" });
}

protected void showDialog (String response){
    Toast.makeText(this, response, Toast.LENGTH_SHORT).show();
    finish();
}

private class doSendTask extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... urls) {
      String response = "";
      // Real code here sends the email
      // Simulate waiting for the email to be sent:
      try { 
          Thread.sleep(5000);
          response = "Waited";
      }
      catch (InterruptedException ex) {  }

      return response;
    }

    @Override
        protected void onPostExecute(String result) {
            showDialog(result);
    }
}

}

問題は、私のアプリがブラウザの上で開いていることです(アプリの名前を示すタイトルバーが付いた白い画面が表示されます)-「待機」が終了するまでブラウザにアクセスできなくなります(したがって、目的が無効になります) sendEmail機能をasyncTask内にラップする方法)。

問題のデモについては、スクリーンキャストを参照してください。

参照:完全なコードに関連する質問

([共有]メニューから)アプリを起動してコードを実行する方法を教えてもらえますか?実際には[表示]がありません(空白の画面とタイトルバーの正しい用語である場合)。

4

2 に答える 2

1
  1. UI なしでアクティビティを開始する
  2. OnCreate でバックグラウンド サービスを実行するサービスを開始する
  3. サービスを開始したらすぐに活動を終了する
  4. サービスが完了について通知またはトーストを投稿できるようにします。

ダイアログを表示したい場合は、サービスからのダイアログだけで別のアクティビティを開始できますが、通常、ダイアログを表示するのは邪魔になります。

于 2012-12-05T17:20:29.073 に答える
0

私を正しい道に導いてくれたNandeeshに感謝します。それを行う方法を正確に知りたい人のために、ここに完全な解決策があります:

1: これを行う UI なしでアクティビティを開始する AndroidManifest で次のテーマを使用しました。

android:theme="@android:style/Theme.NoDisplay"

これにより、最初のアプリケーションが透明になるだけでなく、UI が完全になくなります。

2: OnCreate でバックグラウンド サービスを実行するサービスを開始する ここでも、Share インテントから URL を「取得」し、それを Extra としてサービスに渡す必要がありました。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // get url
    Intent intent = getIntent();
    intent.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP );
    String action = intent.getAction();

    // if this is from the share menu
   if (Intent.ACTION_SEND.equals(action)) {   
           title = intent.getStringExtra(Intent.EXTRA_SUBJECT);
           url = intent.getStringExtra(Intent.EXTRA_TEXT);

           // Flipboard fix (remove title in URL)
           url = url.replace(title, "");

           if (url != null){
            url = title+"\n"+url;
           } else {
            url = "error getting URL";
           }

    // prepare service
    Intent emailSendIntent = new Intent(getApplicationContext(), EmailSendService.class);
    emailSendIntent.putExtra("extraData", url);
    startService(emailSendIntent);

    finish();
   }

}

3: サービスを開始したらすぐにアクティビティを終了します - 上記を参照してください

サービスでは、Extras が OnStart メソッドに渡されることに注意してください (期待される On Create メソッドではありません)。 リンクを参照してください。

4: 完了についてサービスに通知またはトーストを投稿させます。 サービスにダイアログ通知を開くことができませんでした(元のアプリのように)、これによりアプリ/サービスがクラッシュし続けましたが、トーストはうまく機能します-そして、Nandeeshが示唆するように、おそらくそれほど邪魔になりません.

サービスパッケージは次のとおりです。

public class EmailSendService extends Service {

String url;
String message;


@Override
public IBinder onBind(Intent arg0) {
    return null;
}

@Override
public void onCreate() {
    super.onCreate();

}


@Override
public void onDestroy() {
    super.onDestroy();
}

@Override 
public void onStart(Intent intent, int startId) {
      super.onStart(intent, startId);
      url = intent.getExtras().getString("extraData");

      String senderPassword = getResources().getString(R.string.senderPassword); 
      String senderEmail = getResources().getString(R.string.senderEmail); 
      String recipientEmail = getResources().getString(R.string.recipientEmail); 
      String subjectText = getResources().getString(R.string.subjectText);

      GMailSender sender = new GMailSender(senderEmail, senderPassword);
        try {
            sender.sendMail(subjectText,   
                    url,   
                      senderEmail,   
                      recipientEmail);
                message = "Email sent";
            } catch (Exception e) {
                message = "Error sending email";
            }
        Toast.makeText(this, message, Toast.LENGTH_LONG).show();
    }

}

注意。マニフェスト (アプリケーション タグ内) でサービスを宣言することを忘れないでください。

    <service
        android:name=".EmailSendService"
        android:label="CheckIt EmailSendService" >
    </service>
于 2012-12-06T11:14:35.607 に答える