开发者

Clearning Activity's intent data randomly comes back, why?

I have a media a开发者_如何学Gopplication which starts playback when the intent is sent to the player activity with the following intent extras; data "path to the music" and type "mime/audio format".

I pick up the intent data at the player activity execute to start playback and I remove the passed extras from the intent to avoid having the same request going again after flipping the screen or the activity being brought back to the foreground.

This is how I process an intent:

final String data = getIntent().getDataString();
final String type = getIntent().getType();

// start playback
    requestPlay( data, type );

    // remove intents because they are needed only once per call!
    this.getIntent().setDataAndType(Uri.parse(""), "");
    this.getIntent().removeExtra("data");
    this.getIntent().removeExtra("type");

The issue I'm having is that randomly and rarely, I will open the application and when it resumes at the player activity, the intent will contain the previous extra data and start playing... This is annoying to me and well my users...

Anyone have any ideas what's the best way to clear the intents data? Some reason the ActivityManager might be keeping this data stored...?

Thanks!

-Jona


My Solution:

Bundle mExtrass = null;
getIntent().replaceExtras(mExtrass);

And this clear the extra data.


Unclear on this, but have you tried Intent flags FLAG_ACTIVITY_RESET_TASK_IF_NEEDED, FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET, or FLAG_ACTIVITY_NEW_TASK?


When retrieving the data and type strings, try passing them as extras instead of using getDataString() and getType():

final String data = getIntent().getExtras().getString("music_path"); 
final String type = getIntent().getExtras().getString("data_type");

// start playback
    requestPlay( data, type );

    // remove intents because they are needed only once per call!
    this.getIntent().setDataAndType(data, type);
    this.getIntent().removeExtra("music_path");
    this.getIntent().removeExtra("data_type");

Before, you'll need to pass the types as extras:

intent.putExtra("music_path", <path to music>);
intent.putExtra("data_type", <mime/audio format);


I've experienced the same issue. In my case the problem was that I sometimes got two intents on application startup: one in onCreate and then another in onNewIntent. The intent from onCreate had some really old data attached (that should have been cleared according to the docs), while the onNewIntent had no extra data (the correct case).

My solution was to record the last incoming intent (assuming that the last intent is the correct one) and then handle the intent in onResume since that method is called after onCreate and onNewIntent. Like this:

private Intent lastIntent;

public void onCreate()
{
    lastIntent = getIntent();
}

public void onNewIntent(Intent intent)
{
    lastIntent = intent;
}

public void onResume()
{
    if (lastIntent != null)
    {
        // handle lastIntent and then set it to null
        lastIntent = null;
    }
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜