清除活动意图数据随机返回,为什么?

时间:2011-02-17 17:05:53

标签: android

我有一个媒体应用程序,当意图被发送到具有以下意图附加功能的玩家活动时开始播放;数据“音乐之路”并输入“mime / audio format”。

我在播放器活动执行中获取意图数据以开始播放,并从意图中移除传递的额外内容,以避免在翻转屏幕或将活动带回前台后再次发出相同的请求。

这是我处理意图的方式:

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

我遇到的问题是随机而且很少,我会打开应用程序,当它恢复播放器活动时,意图将包含以前的额外数据并开始播放...这对我很烦人我的用户......

任何人都有什么想法清除意图数据的最佳方法是什么?有些原因,ActivityManager可能会保存这些数据......?

谢谢!

-Jona

4 个答案:

答案 0 :(得分:4)

我的解决方案:

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

这清楚了额外的数据。

答案 1 :(得分:0)

不清楚这一点,但您是否尝试过Intent标志FLAG_ACTIVITY_RESET_TASK_IF_NEEDED,FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET或FLAG_ACTIVITY_NEW_TASK?

答案 2 :(得分:0)

检索数据并输入字符串时,请尝试将其作为额外内容传递,而不是使用getDataString()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");

之前,您需要将类型作为附加内容传递:

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

答案 3 :(得分:0)

我遇到过同样的问题。在我的例子中,问题是我有时在应用程序启动时有两个意图:一个在onCreate中,另一个在onNewIntent中。 onCreate的意图附加了一些非常旧的数据(应该根据文档清除),而onNewIntent没有额外的数据(正确的情况)。

我的解决方案是记录最后一个传入的意图(假设最后一个意图是正确的意图),然后在onResume中处理意图,因为在onCreate和onNewIntent之后调用该方法。像这样:

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;
    }
}