Android onPause()或saveInstanceState()?

Android onPause()或saveInstanceState()?,android,Android,我一直在开发我的应用程序,现在我需要了解活动生命周期,但我认为我没有理解它。我有一个活动,上面有七个按钮。当用户按下按钮时,它会打开一个listActivity,用户可以在其中选择列表中的项目,标题会被发送回调用活动,调用活动会在按钮上的文本旁边添加标题。(它使用的方法是在一个switch语句中,这取决于返回的请求代码是什么-我认为这对我来说有点弱。)但是如果用户离开活动并通过“返回”按钮或任何其他按钮返回活动,当它们返回时,没有任何额外的信息——剩下的只是带有原始文本的七个按钮。我希望信息保持

我一直在开发我的应用程序,现在我需要了解活动生命周期,但我认为我没有理解它。我有一个活动,上面有七个按钮。当用户按下按钮时,它会打开一个listActivity,用户可以在其中选择列表中的项目,标题会被发送回调用活动,调用活动会在按钮上的文本旁边添加标题。(它使用的方法是在一个switch语句中,这取决于返回的请求代码是什么-我认为这对我来说有点弱。)但是如果用户离开活动并通过“返回”按钮或任何其他按钮返回活动,当它们返回时,没有任何额外的信息——剩下的只是带有原始文本的七个按钮。我希望信息保持不变——我该怎么做

以下是调用活动的代码:

package com.dinner.live;

import android.app.Activity;
import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;

public class PlanMenu extends Activity {

 static final private int CHOOSE_MONDAY = 0;
 static final private int CHOOSE_TUESDAY = 1;
 static final private int CHOOSE_WEDNESDAY = 2;
 static final private int CHOOSE_THURSDAY = 3;
 static final private int CHOOSE_FRIDAY = 4;
 static final private int CHOOSE_SATURDAY = 5;
 static final private int CHOOSE_SUNDAY = 6;
 private boolean ButtonPushed = false;
 private NotesDbAdapter mDbHelper;
 private MenuDbAdapter menuDbHelper;
 private Long menuID;
 private String mTitleText;
 private String m;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  super.onCreate(savedInstanceState);

  setContentView(R.layout.plan_menu);

  Toast.makeText(this, "Choose a day to pick a meal for!", Toast.LENGTH_LONG).show();
  mDbHelper = new NotesDbAdapter(this);
        mDbHelper.open();
        menuDbHelper = new MenuDbAdapter(this);
        menuDbHelper.open();
  }

 public void mButtonHandler(View target)
    {
  switch(target.getId())
  {
  case R.id.monday:
   if(ButtonPushed == false)
   {
    // Create new intent object and tell it to call the ColorPicker class
    Intent monday = new Intent(this, PlanMenuList.class); 
    // Start ColorPicker as a new activity and wait for the result 
    startActivityForResult(monday, CHOOSE_MONDAY);
    ButtonPushed = true;
    break;
   }
   else
    Toast.makeText(this, "That button has already been pushed." , Toast.LENGTH_LONG).show();
   break;
  case R.id.tuesday:
   // Create new intent object and tell it to call the ColorPicker class
      Intent tuesday = new Intent(this, PlanMenuList.class); 
      // Start ColorPicker as a new activity and wait for the result 
      startActivityForResult(tuesday, CHOOSE_TUESDAY);
      break;
  case R.id.wednesday:
   // Create new intent object and tell it to call the ColorPicker class
      Intent wednesday = new Intent(this, PlanMenuList.class); 
      // Start ColorPicker as a new activity and wait for the result 
      startActivityForResult(wednesday, CHOOSE_WEDNESDAY);
      break;
  case R.id.thursday:
   // Create new intent object and tell it to call the ColorPicker class
      Intent thursday = new Intent(this, PlanMenuList.class); 
      // Start ColorPicker as a new activity and wait for the result 
      startActivityForResult(thursday, CHOOSE_THURSDAY);
      break;
  case R.id.friday:
   // Create new intent object and tell it to call the ColorPicker class
      Intent friday = new Intent(this, PlanMenuList.class); 
      // Start ColorPicker as a new activity and wait for the result 
      startActivityForResult(friday, CHOOSE_FRIDAY);
      break;
  case R.id.saturday:
   // Create new intent object and tell it to call the ColorPicker class
      Intent saturday = new Intent(this, PlanMenuList.class); 
      // Start ColorPicker as a new activity and wait for the result 
      startActivityForResult(saturday, CHOOSE_SATURDAY);
      break;
  case R.id.sunday:
   // Create new intent object and tell it to call the ColorPicker class
      Intent sunday = new Intent(this, PlanMenuList.class); 
      // Start ColorPicker as a new activity and wait for the result 
      startActivityForResult(sunday, CHOOSE_SUNDAY);
      break;
  }



    }


 @Override
    protected void onActivityResult(int requestCode, int resultCode, 
                                    Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);
        if(resultCode == RESULT_OK){
         switch(requestCode)
         {
          case CHOOSE_MONDAY:
           menuID = intent.getExtras().getLong("newRowId");
              menuDbHelper.fetchMenu(menuID);
           populateFields();
           //String label = intent.getExtras().getString("menuString");//intent.getExtras().getLong(MenuDbAdapter.KEY_ROWID);
           Button tv = (Button)findViewById(R.id.monday);
           m = mTitleText;
           tv.setText("Monday" + " - " + mTitleText);
           break;
          case CHOOSE_TUESDAY:
           String labelT = intent.getExtras().getString("menuString");//intent.getExtras().getLong(MenuDbAdapter.KEY_ROWID);
           Button tvT = (Button)findViewById(R.id.tuesday);
           tvT.setText("Tuesday" + " - " + labelT);
           break;
          case CHOOSE_WEDNESDAY:
           String labelW = intent.getExtras().getString("menuString");//intent.getExtras().getLong(MenuDbAdapter.KEY_ROWID);
           Button tvW = (Button)findViewById(R.id.wednesday);
           tvW.setText("Wednesday" + " - " + labelW);
           break;
          case CHOOSE_THURSDAY:
           String labelTh = intent.getExtras().getString("menuString");//intent.getExtras().getLong(MenuDbAdapter.KEY_ROWID);
           Button tvTh = (Button)findViewById(R.id.thursday);
           tvTh.setText("Thursday" + " - " + labelTh);
           break;
          case CHOOSE_FRIDAY:
           String labelFriday = intent.getExtras().getString("menuString");//intent.getExtras().getLong(MenuDbAdapter.KEY_ROWID);
           Button tvFriday = (Button)findViewById(R.id.friday);
           tvFriday.setText("Friday" + " - " + labelFriday);
           break;          
          case CHOOSE_SATURDAY:
           String labelS = intent.getExtras().getString("menuString");//intent.getExtras().getLong(MenuDbAdapter.KEY_ROWID);
           Button tvS = (Button)findViewById(R.id.saturday);
           tvS.setText("Saturday" + " - " + labelS);
           break;
          case CHOOSE_SUNDAY:
           String labelSa = intent.getExtras().getString("menuString");//intent.getExtras().getLong(MenuDbAdapter.KEY_ROWID);
           Button tvSa = (Button)findViewById(R.id.sunday);
           tvSa.setText("Sunday" + " - " + labelSa);
           break;

         }

        }
 }

 private void populateFields() {
        if (menuID != null) {
            Cursor note = menuDbHelper.fetchMenu(menuID);
            startManagingCursor(note);
            mTitleText = (note.getString(
                 note.getColumnIndexOrThrow(MenuDbAdapter.KEY_TITLE)));

        }
    }




}

视情况而定。通常,您需要重写onSaveInstanceState(),并将所有数据保存到Bundle中(这是一个简单的键/值对事务),然后在onCreate()中重新创建该数据(或者,如果要分离代码,则在onRestoreInstanceState()中重新创建)

但是,这主要适用于那些由于用户更改了方向而销毁并重新创建应用程序的实例


如果您希望数据持久化(即,您转到该活动,返回调用活动,甚至可能切换到另一个应用程序,然后返回),我建议将所有内容保存到onPause()中的SharedReferences中,然后将其放回onResume()中。这样,数据将保存在永久性存储中,甚至在系统重置后仍然有效。

视情况而定。通常,您需要重写onSaveInstanceState(),并将所有数据保存到Bundle中(这是一个简单的键/值对事务),然后在onCreate()中重新创建该数据(或者,如果要分离代码,则在onRestoreInstanceState()中重新创建)

但是,这主要适用于那些由于用户更改了方向而销毁并重新创建应用程序的实例


如果您希望数据持久化(即,您转到该活动,返回调用活动,甚至可能切换到另一个应用程序,然后返回),我建议将所有内容保存到onPause()中的SharedReferences中,然后将其放回onResume()中。这样,数据将被保存在永久性存储中,甚至超过系统重置的时间。

我格式化了您的代码,但仍然很混乱。稍微整理一下,把它缩减到相关的部分,你会得到更好的响应。我格式化了你的代码,但还是一团糟。稍微整理一下,把它减少到相关的部分,你会得到更好的回应。很酷,谢谢。我从来没有看过SharedReferences,所以这就是我将要开始的地方。好吧,我一直在四处寻找,但我没有做正确的事情。我认为我无法保存活动状态的原因是因为用户返回活动时调用的布局。有没有更好的方法来处理这个问题?我找到了两个关于共享首选项的不同教程,并试图让它们保存私有字符串m,这样在用户按下“后退”按钮并返回活动后,“星期一”按钮上仍然会显示“星期一+m”,但它没有显示。我认为这与这样一个事实有关,即一旦用户从被调用的活动中选择一个条目,被调用的布局将被显示,而不是被修改的布局文本。我认为我设计的代码不适合这个应用程序。很酷,谢谢。我从来没有看过SharedReferences,所以这就是我将要开始的地方。好吧,我一直在四处寻找,但我没有做正确的事情。我认为我无法保存活动状态的原因是因为用户返回活动时调用的布局。有没有更好的方法来处理这个问题?我找到了两个关于共享首选项的不同教程,并试图让它们保存私有字符串m,这样在用户按下“后退”按钮并返回活动后,“星期一”按钮上仍然会显示“星期一+m”,但它没有显示。我认为这与这样一个事实有关,即一旦用户从被调用的活动中选择一个条目,被调用的布局将被显示,而不是被修改的布局文本。我认为我设计的代码不能用于此应用程序。