【问题标题】:Clearning Activity's intent data randomly comes back, why?学习活动意图数据随机返回,为什么?
【发布时间】:2011-02-17 17:05:53
【问题描述】:

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

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

这是我处理意图的方式:

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 可能会保留这些数据的存储原因...?

谢谢!

-乔纳

【问题讨论】:

    标签: android


    【解决方案1】:

    我的解决方案:

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

    这会清除多余的数据。

    【讨论】:

      【解决方案2】:

      对此不清楚,但您是否尝试过 Intent 标志 FLAG_ACTIVITY_RESET_TASK_IF_NEEDED、FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET 或 FLAG_ACTIVITY_NEW_TASK?

      【讨论】:

        【解决方案3】:

        在检索数据和类型字符串时,尝试将它们作为附加值传递,而不是使用 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);
        

        【讨论】:

        • 问题是我的应用程序是媒体应用程序,它注册了应用程序可播放的受支持的 mime 类型。因此,如果用户单击 mp3 文件,我的应用程序将显示为播放选项...一旦单击以通过我的应用程序播放,我需要调用 getDataString() 和 getType() 来获取 mp3 信息以进行播放。
        【解决方案4】:

        我也遇到过同样的问题。就我而言,问题是我有时在应用程序启动时有两个意图:一个在 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;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-12-16
          • 2014-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-12
          • 1970-01-01
          相关资源
          最近更新 更多