活动之间的意图额外数据何时变为null?

5

我在活动之间接收意图附加信息时遇到了问题。

在我的MainActivity中,我启动一个Gallery活动来选择外部SD卡上的视频文件:

public class MainMenu extends Activity {
    //Button change video
    Button video_change;
    //Extra for changing video content
    Bundle extras;
    //Intent for Gallery view activity
    Intent intent;

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
     //...
     intent = new Intent(getApplicationContext(),GalleryView.class);

     video_change.setOnClickListener(new View.OnClickListener() {

                  @Override
                  public void onClick(View v) {

                      Uri mUri = null;
                      try {
                          Field mUriField = VideoView.class.getDeclaredField("mUri");
                          mUriField.setAccessible(true);
                          mUri = (Uri) mUriField.get(myVideoView);          
                      } catch(Exception e) {
                          //TODO: Something here
                      }
                      String string = mUri.toString();
                      intent.putExtra("old_video",string);
                      startActivity(intent);            
                  }
              });
      }

    @Override
    public synchronized void onResume() {
        super.onResume();
        if (Config.DEBUG)
            Log.d(CLASS_NAME, "+ ON RESUME +");
        try {
            extras = intent.getExtras();
            if (extras != null){
                Log.d("++ ON RESUME ++","Found Extra!");
                String newvideo = extras.getString("new_video");
                Log.d("++ ON RESUME ++","NEW VIDEO: "+ newvideo);
                Uri tempuri = Uri.parse(newvideo);
                myVideoView.setVideoURI(tempuri);         
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        View decorView = getWindow().getDecorView();
        decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_FULLSCREEN
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
    }
  }

然后在我的GalleryView活动中:

public class GalleryView extends Activity {

    ImageView back_button;
    ListView videolist;
    List<String> videos = new ArrayList<String>();
    private File[] videoFiles;
    //private Cursor videocursor;
    //private int video_column_index;
    int x=0;
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.gallery);
         back_button = (ImageView) findViewById(R.id.back_button);
         videolist = (ListView) findViewById(R.id.listview);

         start_listview();

         ArrayAdapter adapter = new ArrayAdapter<String>(this,R.layout.activity_listview,videos);
         videolist.setAdapter(adapter);

         videolist.setOnItemClickListener(new OnItemClickListener(){
              @Override
              public void onItemClick(AdapterView<?> adapter, View v, int position, long arg3) {
                    String value = (String)adapter.getItemAtPosition(position); 
                    Log.d("VALUE: ",value);
                    Intent i = new Intent(getApplicationContext(),MainMenu.class);
                    // Send the file path
                    i.putExtra("new_video", value);
                    startActivity(i);
              }
         });

         back_button.setOnClickListener(new OnClickListener() {
           //videolist.setAdapter(new VideoAdapter(getApplicationContext()));
            @Override
            public void onClick(View v) {
           //videolist.setOnItemClickListener(videogridlistener);
                Intent intent = new Intent(getApplicationContext(),MainMenu.class);
                Bundle extras = getIntent().getExtras();
                String newString = extras.getString("old_video");
                intent.putExtra("new_video", newString);
                startActivity(intent);

            }
         });
     }

    public void start_listview() {

        String path = ("/storage/extsd/Videos/");
        File directory = new File(path);
        videoFiles = directory.listFiles();
        try {
            for (File f : videoFiles) {
                Log.d("FILE: ", f.toString());
                String file = f.toString();
                Uri tempuri = Uri.fromFile(f);
                videos.add(file);
            }
            //Set the visibility of the progress bar to false.
            findViewById(R.id.relativelayout_progress).setVisibility(View.GONE);
        } catch (Exception e) {
            // TODO: handle exception
        }
    }
}

问题是,当我返回到主菜单活动时,发现额外信息,但它是null!来自logcat的信息:
MainMenu           + ON RESUME +
++ ON RESUME ++    Found Extra!
++ ON RESUME ++    NEWVIDEO: null

即使我将extras = intent.getExtras()调用放在onCreate中,它也永远不会被调用,因为它从未通过extras != null检查。


我的解决方法(感谢Stefan的答案)

所以我的主要问题是每当我启动新的Gallery Activity时,我的Main Activity总是被设置为后台。我的清单文件规定它会对Main Activity进行android:launchMode="singleTask"设置。因此,当重新启动Main Activity时,由于应用程序始终在后台运行并且从未传递意图extras,因此意图从未真正传递。因此,我尝试了onNewIntent()方法调用,并在其中尝试了这段代码来接收extras,结果奏效了!再次感谢Stefan!


使用 startActivityForResult 并在 onActivityResult 中检索值。https://developer.android.com/training/basics/intents/result.html - Ken Wolf
我曾经尝试过这个。我会再试一次。 - Eric Reyna
与之前相同的结果,它找到了额外的内容,但字符串为空。 - Eric Reyna
如果你只是想在同一个类中稍后引用它,为什么不将它存储在类成员变量中呢? - Ken Wolf
我并不认为这会有什么区别,不是吗?我将意图(Intent)、额外(Extra)和新视频(NewVideo)字符串设为公共(public)。 - Eric Reyna
1个回答

3
你所做的是在打开相册后再次调用MainActivity。根据您清单中使用的标志,可能导致您的主活动不会第二次启动,而是将初始主活动取消暂停并提升到前台。
如果是这种情况,由于活动生命周期,onCreate(...)不会再次调用,但您可以检查是否调用了以下方法:
@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    //TODO: check here if your intent extras arrive and log, then debug
}

啊,是的。我在我的清单文件中看到,我的活动设置为 android:launchMode="singleTask"。我会尝试看看如何使用 onNewIntent。 - Eric Reyna
1
将日志放置在OnNewIntent中,但它从未被调用。 - Eric Reyna
我能够使用您的方法使其工作!我从在MainMenu中使用onActivityResult和在Gallery Activity中使用setResult();的方式进行更改,而是只是使用了onNewIntent方法,通过添加extras并使用startActivity(intent); - Eric Reyna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接