10

動画ファイルをダウンロードして SD カードに保存するアプリケーションを開発しました。その過程で、ダウンロードの進行状況とステータスを、NotificationManager.

と呼ばれる私のクラスは、をDownloadTask.java拡張しAsyncTaskます。onProgressUpdate()そのため、ここでは目的のために を使用するメソッドを使用して進行状況を更新しNotificationManagerます。ダウンロードが完了したら、通知をクリックして特定のビデオファイルを開くことを除いて、すべてが魅力のように機能します。だからこれは私がやったことです:

mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);

int icon = android.R.drawable.stat_sys_download_done;
long when = System.currentTimeMillis();

mNotification = new Notification(icon, "", when);
mContentTitle_complete = mContext.getString(R.string.download_complete);
notificationIntent = new Intent(mContext,OpenDownloadedVideo.class);
notificationIntent.putExtra("fileName", file);
mContentIntent = PendingIntent.getActivity(mContext, 0, notificationIntent, 0);
mNotification.setLatestEventInfo(mContext, file, mContentTitle_complete, mContentIntent);
mNotification.flags = Notification.FLAG_AUTO_CANCEL;
mNotificationManager.notify(NOTIFICATION_ID, mNotification);

fileName私の場合、とNOTIFICATION_IDは一意であることに注意してください。

Activity OpenDownloadedVideo.java、次の方法でファイルを開きます。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    try {  
        fileName = getIntent().getExtras().getString("fileName");
        Intent i = new Intent(Intent.ACTION_VIEW);
        File videoFileToPlay = new File(Environment.getExternalStorageDirectory()+"/MyFolder"+"/"+fileName);
        i.setDataAndType(Uri.fromFile(videoFileToPlay), "video/*");
        startActivity(i);
        finish();
    } catch(Exception e) {
        //
    }
}

そのため、初めてビデオをダウンロードして通知をクリックすると、適切なビデオ ファイルが開かれます。ただし、次回別のビデオをダウンロードし、通知をクリックすると、ダウンロードされた最初のファイルが再び開かれます。

これは、getIntentinsideが最新のものではなく、OpenDownloadedVideo最初に作成されたものを返すためです。Intentどうすればこれを修正できますか?

また、複数のビデオをダウンロードした場合にも問題が発生することに注意してください。たとえば、5 つの異なるビデオ ファイルをダウンロードし、ステータス バーに 5 つの通知が表示された場合などです。通知をクリックするたびに同じファイルが開かれます。

4

6 に答える 6

12
/**
 * Override super.onNewIntent() so that calls to getIntent() will return the
 * latest intent that was used to start this Activity rather than the first
 * intent.
 */
@Override
public void onNewIntent(Intent intent){
    super.onNewIntent(intent); // Propagate.
    setIntent(intent); // Passing the new intent to setIntent() means this new intent will be the one returned whenever getIntent() is called.
}
于 2014-10-30T12:23:00.280 に答える
11

実際には、次のように PendingIntent.FLAG_UPDATE_CURRENT でPendingIntentを作成するだけです。

mContentIntent = PendingIntent.getActivity(mContext, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
于 2013-05-22T00:32:01.107 に答える
9

Android Activity.onNewIntent() ドキュメントから

getIntent() は元の Intent を返すことに注意してください。setIntent(Intent) を使用して、この新しい Intent に更新できます。

そのため、新しいインテントを取得したら、アクティビティ インテントとして明示的に設定する必要があります。

于 2012-08-24T11:31:11.877 に答える
5

@Alex と @Codinguser さん、返信ありがとうございます。とても有難い。しかし、私のために働いた別の答えを見つけました。を作成するときに、一意の値PendingIntentIntent渡します。私の場合、私はこれをしていました:

mContentIntent = PendingIntent.getActivity(mContext, 0, notificationIntent, 0); 

でもユニークだったので今は使っNOTIFICATION_IDています。上記の呼び出しを次のように変更しました。

mContentIntent = PendingIntent.getActivity(mContext, NOTIFICATION_ID,
                                           notificationIntent, 0);

それだけで動作します。

保留中の意図の複数のインスタンスに関する質問で、それに関するいくつかの情報を見つけました

于 2012-08-29T09:08:11.083 に答える
0

OpenDownloadedVideoアクティビティをSINGLE_TOPにしてオーバーライドするとどうなりますonNewIntentか?

于 2012-08-24T10:58:13.147 に答える