title: Android app crashes when button is pressed after not having the app open for a while?
body: <p>I am making an app, and if I use it normally it works fine with no crashes. There is one activity with two fragments that are swapped, and one has two buttons on it. If the app isn't used for a while (hours) and the app is reopened, then if I press one of the buttons the app crashes. This only happens if I exited out of the app with the Home button, if I exit out by pressing Back a few times then this problem doesn't occur.</p>
  
  <p>I can also replicate this crash if I open the app, press the home button to go back to the android home screen, and press my Advanced Task Killer app button. When I open up the app again, it opens on the same fragment it left off on (which is weird, I'd think after using a task killer it would start fresh) and if I press one of the buttons the app crashes. </p>
  
  <p>EDIT: I found out through logcat that it is passing my tempmainfrag as null when I resume the app in the following code, which becomes a problem in both saveButtonClicked() and deleteButtonClicked():</p>
  
  <pre><code>    /*
   * Copyright (C) 2012 The Android Open Source Project
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package com.example.android.fragments;
  
  import android.app.AlertDialog;
  import android.content.Context;
  import android.content.DialogInterface;
  import android.os.Bundle;
  import android.support.v4.app.FragmentActivity;
  import android.support.v4.app.FragmentTransaction;
  import android.util.Log;
  import android.view.View;
  import android.view.animation.Animation;
  import android.view.animation.AnimationUtils;
  import android.view.inputmethod.InputMethodManager;
  import android.widget.CheckBox;
  import android.widget.EditText;
  import android.widget.TimePicker;
  import android.widget.Toast;
  
  public class MainActivity extends FragmentActivity 
          implements MainListFragment.OnListSelectedListener {
  
      MainListFragment tempmainfrag;
      InfoFragment infofrag;
      int mainPosition = -1;
  
      /** Called when the activity is first created. */
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.mainlayout);
  
          // Check whether the activity is using the layout version with
          // the fragment_container FrameLayout. If so, we must add the first fragment
          if (findViewById(R.id.fragment_container) != null) { //meaning, if using phone version
  
              // However, if we're being restored from a previous state,
              // then we don't need to do anything and should return or else
              // we could end up with overlapping fragments.
              if (savedInstanceState != null) {
                  return;
              }
  
  
  
              // Create an instance of MainListFragment
              tempmainfrag = new MainListFragment();  //made a context parameter to pass the context
  
              // In case this activity was started with special instructions from an Intent,
              // pass the Intent's extras to the fragment as arguments
              tempmainfrag.setArguments(getIntent().getExtras());
  
  
  
              // Add the fragment to the 'fragment_container' FrameLayout
              getSupportFragmentManager().beginTransaction()
                      .add(R.id.fragment_container, tempmainfrag).commit();
  
              Log.i("mydebug","TEMPMAINFRAG: " + tempmainfrag);
          }
      }
  
      public void onResume()
      {
          super.onResume();
  
  
      }
  
  
      public void onItemSelected(int position, String schedulename, String[] ampm, boolean[] days, int[] times, boolean vibrate) {
          // The user selected a list item
  
          //////////////////////////////TWO PANE LAYOUT STUFF///////////////////////////////////
          // Capture the article fragment from the activity layout
  //        InfoFragment articleFrag = (InfoFragment)
  //                getSupportFragmentManager().findFragmentById(R.id.article_fragment);  //article_fragment exists in layout-large
  //
  //        if (articleFrag != null) {
  //            // If article frag is available, we're in two-pane layout...
  //
  //            // Call a method in the ArticleFragment to update its content
  //            articleFrag.updateArticleView(position);
  //
  //        } else {
              // phone layout - swap frags
  
              mainPosition = position;
  
              // Create fragment and give it an argument for the selected article
              infofrag = new InfoFragment();
              Bundle args = new Bundle();
              args.putInt(infofrag.ARG_POSITION, position);
  
              //new stuff to add info
              args.putString(infofrag.ARG_NAME, schedulename);    
              args.putBooleanArray(infofrag.ARG_DAYS, days);
              args.putIntArray(infofrag.ARG_TIMES, times);
              args.putBoolean(infofrag.ARG_VIBRATE, vibrate); 
              args.putStringArray(infofrag.ARG_AMPM, ampm);
  
              infofrag.setArguments(args);
              FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
  
              // Replace whatever is in the fragment_container view with this fragment,
              // and add the transaction to the back stack so the user can navigate back
              transaction.replace(R.id.fragment_container, infofrag);
              transaction.addToBackStack(null);
  
              // Commit the transaction
              transaction.commit();
  
      }
  
      public void saveButtonClicked(View view) {  //pass the click to the mainlistfragment
          Log.i("mydebug","TEMPMAINFRAG: " + tempmainfrag);
          Log.i("mydebug","enter2222!!!!!!");
          boolean redo = false;
          //create toast
          Toast toast;
  
          //get title
          EditText titletext = (EditText)this.findViewById(R.id.titletext);
  
          //get checkboxes
          CheckBox check1 = (CheckBox)this.findViewById(R.id.monbox); //recreate checkboxes from view in activity (doesnt extend Activity 
          CheckBox check2 = (CheckBox)this.findViewById(R.id.tuebox); //so use getActivity())
          CheckBox check3 = (CheckBox)this.findViewById(R.id.wedbox);
          CheckBox check4 = (CheckBox)this.findViewById(R.id.thubox);
          CheckBox check5 = (CheckBox)this.findViewById(R.id.fribox);
          CheckBox check6 = (CheckBox)this.findViewById(R.id.satbox);
          CheckBox check7 = (CheckBox)this.findViewById(R.id.sunbox);
          CheckBox vibratebox = (CheckBox)this.findViewById(R.id.vibratecheckbox);
  
          //get times
          TimePicker startpicker = (TimePicker)this.findViewById(R.id.starttimepicker);
          TimePicker stoppicker = (TimePicker)this.findViewById(R.id.stoptimepicker);
  
          EditText temppp = titletext;
          //check for input errors
          if(titletext.getText().toString().length() == 0) //if title is empty
          {
              redo = true;
              toast = Toast.makeText(view.getContext(), "Enter an event name", 4);
              toast.show();
  
              //some sick-ass shake animations!!!
              Animation shake = AnimationUtils.loadAnimation(titletext.getContext(), R.anim.shake_big);
              this.findViewById(R.id.titletext).startAnimation(shake);
          }
          else if((!check1.isChecked()) &amp;&amp; (!check2.isChecked()) &amp;&amp; (!check3.isChecked()) &amp;&amp; 
                  (!check4.isChecked()) &amp;&amp; (!check5.isChecked()) &amp;&amp; (!check6.isChecked()) &amp;&amp; 
                  (!check7.isChecked()))  //if all checkboxes arent checked
          {
              redo = true;
              toast = Toast.makeText(view.getContext(), "At least one day of week must be checked", 4);
              toast.show();
  
              //more sick-ass shake animations!!!
              Animation shake = AnimationUtils.loadAnimation(titletext.getContext(), R.anim.shake_small);
              this.findViewById(R.id.checkboxes).startAnimation(shake);
              this.findViewById(R.id.daysofweek).startAnimation(shake);
              this.findViewById(R.id.frequencytext).startAnimation(shake);
          }
  
          if(!redo)   //if all info is fine
          {
              //check to see if time goes into next day
              if((startpicker.getCurrentHour() &gt; stoppicker.getCurrentHour())||
                      ((startpicker.getCurrentHour() == stoppicker.getCurrentHour())
                              &amp;&amp; (startpicker.getCurrentMinute() &gt;= stoppicker.getCurrentMinute())))
              {
                  toast = Toast.makeText(view.getContext(), "Note: Stop time is earlier than start time, so this schedule stops at next day", Toast.LENGTH_LONG);
                  toast.show();
              }
  
              toast = Toast.makeText(view.getContext(), "Schedule saved", Toast.LENGTH_LONG);
              toast.show();
  
              //changing old schedule to new one
              boolean[] tempdays = {check1.isChecked(), check2.isChecked(), check3.isChecked(), check4.isChecked(), 
                      check5.isChecked(), check6.isChecked(), check7.isChecked()};
  
              tempmainfrag.mainObjectList.changeSchedule(mainPosition, titletext.getText().toString(), tempdays, vibratebox.isChecked(), 
                      startpicker.getCurrentHour()-1, startpicker.getCurrentMinute(), stoppicker.getCurrentHour()-1, stoppicker.getCurrentMinute());
  
              //used to hide keyboard in case its still open when displaying list
              InputMethodManager imm = (InputMethodManager)this.getSystemService(
                        Context.INPUT_METHOD_SERVICE);
                  imm.hideSoftInputFromWindow(titletext.getWindowToken(), 0);
  
              this.onBackPressed();   //replicates backpress to go back to list
          }
      }
  
      public void deleteButtonClicked(View view)
      {
          //make a notification
  
          AlertDialog.Builder builder = new AlertDialog.Builder(this);
          builder.setTitle("Delete?");
          builder.setIcon(R.drawable.trash_icon);
          builder.setMessage("Are you sure you wish to delete this schedule?")
             .setCancelable(false)
             .setPositiveButton("Delete", new DialogInterface.OnClickListener() {
                 public void onClick(DialogInterface dialog, int id) {
                     tempmainfrag.mainObjectList.removeSchedule(mainPosition);
  
                     tempmainfrag.exit();
                 }
             })
             .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                 public void onClick(DialogInterface dialog, int id) {
                      dialog.dismiss();
                 }
             });
          AlertDialog alert = builder.create();
          alert.show();
      }
  
      public void hideKeyboard()  //hides keyboard, called whenever reverting back to list
      {
          InputMethodManager imm = (InputMethodManager)getSystemService(
                    Context.INPUT_METHOD_SERVICE);
              imm.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0);
      }
  
  
  }
  </code></pre>
  
  <p>I have tried some solutions in onResume but can't think of anything, any ideas? Thank you guys a lot.</p>