2017-02-13 13 views
0

У меня возникли проблемы с получением дополнительных заданий между действиями.Когда намеренные дополнения становятся нулевыми между действиями?

В моей MainActivity я начала деятельность галереи выбрать видео файлы на внешней 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 
     } 
    } 
} 

Проблема в том, я когда я вернусь обратно к деятельности MainMenu, я добавлен дополнительный, но null! От LogCat:

MainMenu   + ON RESUME + 
++ ON RESUME ++ Found Extra! 
++ ON RESUME ++ NEWVIDEO: null 

Даже если я поставить extras = intent.getExtras() вызов в OnCreate, он никогда не вызывается, потому что он никогда не проходит у extras != null Регулярно проверяйте


КАК ИСПРАВЛЕНО IT (спасибо ОТВЕТ Стефану)

Таким образом, моя основная проблема заключалась в том, что моя основная активность всегда была установлена ​​в фоновом режиме всякий раз, когда я начинал новую деятельность в галерее. Мой файл манифеста продиктовал, что он будет делать android:launchMode="singleTask" на главной операции. Итак, каким-то образом, когда основное действие было повторно запущено, намерение никогда не было действительно передано, так как приложение всегда работало в фоновом режиме и никогда не передавало намерений. Поэтому я попробовал вызов метода onNewIntent() и попробовал часть кода, чтобы получить дополнительные функции, и это сработало! Еще раз спасибо Стефану!

+0

Использование 'startActivityForResult' и получить значение 'onActivityResult' https://developer.android.com/training/basics/intents/result.html –

+0

Я попробовал это один раз. Я попробую еще раз –

+0

Тот же результат, что и раньше, нашел лишний, но строка равна нулю. –

ответ

1

Что вы делаете, это снова позвонить MainActivity после открытия галереи. В зависимости от флагов, используемых в вашем манифесте, это может привести к тому, что ваш основной вид активности не будет запущен вторым типом, но ваше начальное основное действие будет приостановлено и поднято на передний план.

Если это так, из-за жизненный цикл деятельности, onCreate(...) не будет вызываться снова, но вы можете проверить, если следующий метод называется:

@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 
    //TODO: check here if your intent extras arrive and log, then debug 
} 
+0

Ahh да. Я вижу в своем манифесте, у меня есть действие, установленное на 'android: launchMode =" singleTask "'. Я попытаюсь посмотреть, как работает onNewIntent. –

+0

Размещенные журналы внутри OnNewIntent, но он никогда не вызывается. –

+0

Мне удалось заставить это работать, используя ваш метод! Я изменил его с помощью onActivityResult в MainMenu и 'setResult();' в действии Gallery и вместо этого использовал метод onNewIntent, добавив дополнительные функции и используя 'startActivity (намерение);' –