码迷,mamicode.com
首页 > 移动开发 > 详细

Android---Activity

时间:2018-08-13 21:23:12      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:fine   splay   ESS   接收参数   更新   ack   基本设置   标准   onpause   

  • activity的生命周期

  onCreate()

  您必须实现此回调,该回调在系统首次创建活动时触发。在活动创建时,活动进入创建状态。在onCreate()方法中,您执行基本的应用程序启动逻辑,该逻辑在活动的整个生命周期中只应发生一次。例如,onCreate()的实现可能会将数据绑定到列表,将活动与ViewModel关联,并实例化一些类范围变量。此方法接收参数savedInstanceState,该参数是包含活动先前保存状态的Bundle对象。如果活动以前从未存在过,则Bundle对象的值为null。以下onCreate()方法示例显示了活动的基本设置,例如声明用户界面(在XML布局文件中定义),定义成员变量以及配置某些UI。在此示例中,通过将文件的资源ID R.layout.main_activity传递给setContentView()来指定XML布局文件。

 1 TextView mTextView;
 2 
 3 // some transient state for the activity instance
 4 String mGameState;
 5 
 6 @Override
 7 public void onCreate(Bundle savedInstanceState) {
 8     // call the super class onCreate to complete the creation of activity like
 9     // the view hierarchy
10     super.onCreate(savedInstanceState);
11 
12     // recovering the instance state
13     if (savedInstanceState != null) {
14         mGameState = savedInstanceState.getString(GAME_STATE_KEY);
15     }
16 
17     // set the user interface layout for this activity
18     // the layout file is defined in the project res/layout/main_activity.xml file
19     setContentView(R.layout.main_activity);
20 
21     // initialize member TextView so we can manipulate it later
22     mTextView = (TextView) findViewById(R.id.text_view);
23 }
24 
25 // This callback is called only when there is a saved instance that is previously saved by using
26 // onSaveInstanceState(). We restore some state in onCreate(), while we can optionally restore
27 // other state here, possibly usable after onStart() has completed.
28 // The savedInstanceState Bundle is same as the one used in onCreate().
29 @Override
30 public void onRestoreInstanceState(Bundle savedInstanceState) {
31     mTextView.setText(savedInstanceState.getString(TEXT_VIEW_KEY));
32 }
33 
34 // invoked when the activity may be temporarily destroyed, save the instance state here
35 @Override
36 public void onSaveInstanceState(Bundle outState) {
37     outState.putString(GAME_STATE_KEY, mGameState);
38     outState.putString(TEXT_VIEW_KEY, mTextView.getText());
39 
40     // call superclass to save any view hierarchy
41     super.onSaveInstanceState(outState);
42 }

 

  onStart()

  当onCreate()退出时,活动进入Started状态,活动对用户可见。 这个回调包含了活动最终准备到达前台并变得互动的内容。

  onResume()

  系统在活动开始与用户交互之前调用此回调。 此时,活动位于活动堆栈的顶部,并捕获所有用户输入。 应用程序的大多数核心功能都是在onResume()方法中实现的。onPause()回调始终跟在onResume()之后。

  onPause()

  当活动失去焦点并进入暂停状态时,系统调用onPause()。 例如,当用户点击“后退”或“最近”按钮时,会出现此状态。 当系统为您的活动调用onPause()时,它在技术上意味着您的活动仍然部分可见,但大多数情况下表明用户正在离开活动,并且活动很快将进入“已停止”或“已恢复”状态。如果用户期望UI更新,则处于暂停状态的活动可以继续更新UI。 这种活动的示例包括示出导航地图屏幕或媒体播放器播放的活动。 即使这些活动失去焦点,用户也希望他们的UI继续更新。您不应使用onPause()来保存应用程序或用户数据,进行网络调用或执行数据库事务。一旦onPause()完成执行,下一个回调就是onStop()或onResume(),具体取决于活动进入Paused状态后会发生什么。

  onStop()

  当活动不再对用户可见时,系统调用onStop()。 这可能是因为活动被破坏,新活动正在开始,或者现有活动正在进入恢复状态并且正在覆盖已停止的活动。 在所有这些情况下,停止的活动根本不再可见。系统调用的下一个回调是onRestart(),如果活动返回与用户交互,或者如果此活动完全终止,则由onDestroy()调用。应该使用onStop()执行相对CPU密集型的关闭操作。例如,如果找不到更合适的时间将信息保存到数据库,则可以在onStop()期间执行此操作。

 

  onRestart()

  当处于“已停止”状态的活动即将重新启动时,系统将调用此回调。 onRestart()从停止时恢复活动的状态。此回调始终跟随onStart()。

  onDestroy()

  系统在销毁活动之前调用此回调。此回调是活动收到的最后一个回调。 通常实现onDestroy()以确保在活动或包含它的进程被销毁时释放所有活动的资源。

 

技术分享图片

 

 

  • 保存和恢复瞬态UI状态

  当活动因系统限制而被销毁时,您应该使用ViewModel,onSaveInstanceState()和/或本地存储的组合来保留用户的瞬态UI状态。本节概述了实例状态以及如何实现onSaveInstance()方法,该方法是对活动本身的回调。如果您的UI数据简单而轻量级,例如原始数据类型或简单对象(如String),则可以单独使用onSaveInstanceState()来保持UI状态跨越配置更改和系统启动的进程死亡。但是,在大多数情况下,您应该使用ViewMode    onSaveInstanceState()(如保存UI状态中所述),因为onSaveInstanceState()会导致序列化/反序列化的成本。

  使用onSaveInstanceState()保存简单,轻量级的UI状态当您的活动开始停止时,系统会调用onSaveInstanceState()方法,以便您的活动可以将状态信息保存到实例状态包。此方法的默认实现保存有关活动视图层次结构状态的瞬态信息,例如EditText小部件中的文本或ListView小部件的滚动位置。要为活动保存其他实例状态信息,必须覆盖onSaveInstanceState()并将键值对添加到在活动意外销毁时保存的Bundle对象。如果重写onSaveInstanceState(),则必须调用超类实现,如果希望默认实现保存视图层次结构的状态。例如:

 1 static final String STATE_SCORE = "playerScore";
 2 static final String STATE_LEVEL = "playerLevel";
 3 // ...
 4 
 5 
 6 @Override
 7 public void onSaveInstanceState(Bundle savedInstanceState) {
 8     // Save the user‘s current game state
 9     savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
10     savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
11 
12     // Always call the superclass so it can save the view hierarchy state
13     super.onSaveInstanceState(savedInstanceState);
14 }

  注意:当用户显式关闭活动时或在调用finish()的其他情况下,不会调用onSaveInstanceState()。但可以在轮换或切换到多窗口模式下使用。

  • 使用已保存的实例状态还原活动UI状态

  在先前销毁活动后重新创建活动时,可以从系统传递给活动的Bundle中恢复已保存的实例状态。 onCreate()和onRestoreInstanceState()回调方法都接收包含实例状态信息的相同Bundle。因为无论系统是创建活动的新实例还是重新创建前一个实例,都会调用onCreate()方法,因此在尝试读取之前必须检查状态Bundle是否为null。 如果它为null,则系统正在创建活动的新实例,而不是恢复已销毁的先前实例。例如,以下代码段显示了如何在onCreate()中恢复某些状态数据:

 1 @Override
 2 protected void onCreate(Bundle savedInstanceState) {
 3     super.onCreate(savedInstanceState); // Always call the superclass first
 4 
 5     // Check whether we‘re recreating a previously destroyed instance
 6     if (savedInstanceState != null) {
 7         // Restore value of members from saved state
 8         mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
 9         mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
10     } else {
11         // Probably initialize members with default values for a new instance
12     }
13     // ...
14 }

  您可以选择实现onRestoreInstanceState(),系统在onStart()方法之后调用而不是在onCreate()期间恢复状态。 仅当存在要恢复的已保存状态时,系统才会调用onRestoreInstanceState(),因此您无需检查Bundle是否为null:

1 public void onRestoreInstanceState(Bundle savedInstanceState) {
2     // Always call the superclass so it can restore the view hierarchy
3     super.onRestoreInstanceState(savedInstanceState);
4 
5     // Restore state members from saved instance
6     mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
7     mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
8 }
  • 从一个活动启动另一个活动

  1、starttActivity()

  如果新启动的活动不需要返回结果,则当前活动可以通过调用startActivity()方法启动它。

 1 Intent intent = new Intent(this, SignInActivity.class);

2 startActivity(intent); 

  2、应用程序启动自己没有的活动,可以利用设备上其他应用程序提供的活动。您可以创建描述您要执行的操作的意图,系统从另一个应用程序启动相应的活动。 如果有多个活动可以处理意图,那么用户可以选择使用哪个活动。 例如,如果要允许用户发送电子邮件,可以创建以下意图:

 1 Intent intent = new Intent(Intent.ACTION_SEND);

2 intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);

3 startActivity(intent); 

  3、startActivityForResult()

  有时您希望在活动结束时从结果中获取结果。例如,您可以启动一项活动,让用户在联系人列表中选择一个人;当它结束时,它返回被选中的人。为此,请调用startActivityForResult(Intent,int)方法,其中integer参数标识调用。此标识符用于消除来自同一活动的多次startActivityForResult(Intent,int)调用之间的歧义。它不是全局标识符,不存在与其他应用程序或活动冲突的风险。结果通过onActivityResult(int,int,Intent)方法返回。当子活动退出时,它可以调用setResult(int)将数据返回到其父级。子活动必须始终提供结果代码,该结果代码可以是标准结果RESULT_CANCELEDRESULT_OK或从RESULT_FIRST_USER开始的任何自定义值。此外,子活动可以选择返回包含所需的任何其他数据的Intent对象。父活动使用onActivityResult(int,int,Intent)方法以及父活动最初提供的整数标识符来接收信息。如果子活动因任何原因(例如崩溃)失败,则父活动将收到代RESULT_CANCELED的结果。

 1 public class MyActivity extends Activity {
 2      // ...
 3 
 4      static final int PICK_CONTACT_REQUEST = 0;
 5 
 6      public boolean onKeyDown(int keyCode, KeyEvent event) {
 7          if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
 8              // When the user center presses, let them pick a contact.
 9              startActivityForResult(
10                  new Intent(Intent.ACTION_PICK,
11                  new Uri("content://contacts")),
12                  PICK_CONTACT_REQUEST);
13             return true;
14          }
15          return false;
16      }
17 
18      protected void onActivityResult(int requestCode, int resultCode,
19              Intent data) {
20          if (requestCode == PICK_CONTACT_REQUEST) {
21              if (resultCode == RESULT_OK) {
22                  // A contact was picked.  Here we will just display it
23                  // to the user.
24                  startActivity(new Intent(Intent.ACTION_VIEW, data));
25              }
26          }
27      }
28  }

 

Android---Activity

标签:fine   splay   ESS   接收参数   更新   ack   基本设置   标准   onpause   

原文地址:https://www.cnblogs.com/adapter/p/9470929.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!