您的位置:首页 > 其它

Activity 的小结

2015-08-22 10:54 316 查看
最近发现一些基础的东西不够清晰,重新看一下文档,整理一些基础的东西,打好基础,把握大局观,一点一滴,慢慢进步~

分三点:

1.生命周期。

2.用于监测与控制的环节。

3.容易忽略的地方.

第一.生命周期。

先看一下Activity的生命周期图,来自于文档4.2。



.


1.oncreate(); activity一开始就执行,可通过setcontentview加载view,通过findvirebyid检索到view,添加数据到列表 等等,还可以获取之前的状态进行恢复。可以通过managedQuery来获取需要显示的数据,在这个方法里可以使用finish的方法,执行这个方法后会立即掉用ondestroy的方法,而其他的生命周期将不再执行。

2.onstart();当activity开始可见的时候执行,注意的是这方法必须调用super的方法,否则会报异常。

3.onresume();当activity开始于用户交互的时候执行,这里适合开始执行动画还有启动类似摄像头这种独立访问的设备。

4.onpause ();在这个方法里不要做过于冗长的处理。一般用于保存一些与用户交互续变化的状态,为了体现“edit in place”的模式给用户,也就是用户的编辑操作不需要更多的确认就立即见效。还有在没有杀死当前activity的情况下如果没有足够的资源去启动一个新的activity,那么必须保证没有任何的资源与数据丢失。在这里可以进行关闭动画以及关闭一些消耗大量cpu的东西以便于能快速的切换到下个activity,或者关闭一些类似于摄像头的独立访问的设备。

当系统需要内存的情况下,可能会杀死处于onpause状态的进程去释放资源,所以切换到这个状态的时候确保保存了你的状态。

在这个状态下可能会进入onstop(当下个activity启动运行之后),可是也有一些情况下不会切换到onstop而会直接进入onresume,当用户重新进入活动时。其外,可以在这个方法里对一些持续变化的数据进行保存,以便恢复,看以下这段话:

Note the "Killable" column in the above table -- for those methods that are marked as being killable, after that method returns the process hosting the activity may killed by the system at any time without another line of
its code being executed. Because of this, you should use the onPause() method to write any persistent data (such as user edits) to storage. In addition, the method onSaveInstanceState(Bundle) is called before placing the
activity in such a background state, allowing you to save away any dynamic instance state in your activity into the given Bundle, to be later received in onCreate(android.os.Bundle) if the activity needs to be re-created. Note
that it is important to save persistent data in onPause() instead of onSaveInstanceState(android.os.Bundle) because the latter is not part of the lifecycle callbacks, so will not be called in every situation as described in its documentation.

比如说用于保存一些用户编辑数据,像日历:

public class CalendarActivity extends Activity {
...

static final int DAY_VIEW_MODE = 0;
static final int WEEK_VIEW_MODE = 1;

private SharedPreferences mPrefs;
private int mCurViewMode;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

SharedPreferences mPrefs = getSharedPreferences();
mCurViewMode = mPrefs.getInt("view_mode", DAY_VIEW_MODE);
}

protected void onPause() {
super.onPause();

SharedPreferences.Editor ed = mPrefs.edit();
ed.putInt("view_mode", mCurViewMode);
ed.commit();
}
}


5.ontsop();当activity不在可见的时候进触发,接下来可能会进入onrestart 或者ondestroy也可能不会进入任何状态。

值得注意的是,这个方法可能不会被执行到,在onpause已经被执行后,当在低内存的情况下可能没有足够的内存去保持activity的运行,那么就可能不会运行该方法就杀死了。

第二.用于检测与控制的环节。

Activity的生命周期有三个主要的环节用于检测与控制:(这是翻译于文档,结合自己的一些体会)

1.the entire lifetime .整个生命周期。这个环节一开始先调用oncreate(),最后只会调用一次ondestory(),在oncreate 里面可以做所有全局状态的设置,比如说设置全屏显示,加载指定布局,等等。最后会在ondestroy()里释放所有资源。比如说,你可能在oncreate()里创建了一个加载网络数据的线程,他最终会在ondestroy里面被停止如果在之前一直运行着的话。

2.the visiable lifetime 生命周期的可见环节。这个环节是从onstart到onstop .在这个环节 ,Activity可能一直处于屏幕与用户交互也有可能处于后台与用户交互,在这两个方法里可以对一些展示给用户的资源进行控制,比如说可以在onstart里注册一个会影响ui的广播,然后在onstop里进行销毁,这样Activity被销毁 了后广播也会被销毁。这两个方法可能会被调用多次当Activity在可见与不可见之间切换是后。

3.foreground lifetime 生命周期的焦点环节。这个环节发生的时后会调用onresume()方法,直到调用onpause方法,在这个环节里activity一直处于栈顶,与用户经行交互。activity可以很快的从onresume 切换到onpause ,比如说在设备切换到休眠的时候,在activity的处理结果被发送,在一个新的意图被发送的时候,所以在这两个方法里面应该写一些不是那么重要的代码。



第三.容易忽略的地方;

我们先把各个生命周期打印出来:

public class MainActivity extends ActionBarActivity implements PsSelectMenu.PaperSelectLintener{
private Button mButton;
private ImageView mView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i("------------------","onCreate");
setContentView(R.layout.activity_main);
PsSelectMenu menu=(PsSelectMenu)findViewById(R.id.menu);
IniteSelectmenu initeSelectmenu=new IniteSelectmenu();
Selectbean bean=initeSelectmenu.getselectbean();
menu.setData(bean);
menu.setSelectListener(this);

}

@Override
public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
Log.i("------------------","onCreateView  name= "+name);

return super.onCreateView(parent, name, context, attrs);
}

@Override
protected void onStart() {
super.onStart();
Log.i("------------------", "onStart");
}

@Override
protected void onResume() {
super.onResume();
Log.i("------------------", "onResume");
}

@Override
protected void onPause() {
super.onPause();
Log.i("------------------", "onPause");
}

@Override
protected void onStop() {
super.onStop();
Log.i("------------------", "onStop");
}

@Override
protected void onDestroy() {
super.onDestroy();
Log.i("------------------", "onDestroy");
}

@Override
public void onSelected(Selectresult rSelectresult) {
Toast.makeText(MainActivity.this,rSelectresult.toString(),Toast.LENGTH_LONG).show();
}
}


启动运行运行程序,发现打印出来一开始不是oncreate,而已oncreateView:

------------------﹕ onCreateView name= LinearLayout

08-22 06:42:53.420 1699-1699/com.example.administrator.myapplication I/------------------﹕ onCreateView name= ViewStub

08-22 06:42:53.420 1699-1699/com.example.administrator.myapplication I/------------------﹕ onCreateView name= FrameLayout

08-22 06:42:53.420 1699-1699/com.example.administrator.myapplication I/------------------﹕ onCreate

08-22 06:42:53.420 1699-1699/com.example.administrator.myapplication I/------------------﹕ onCreateView name=android.support.v7.internal.widget

1699-1699/com.example.administrator.myapplication I/------------------﹕ onCreateView name= android.support.v7.internal.widget.ActionBarContextView

08-22 06:42:53.430 1699-1699/com.example.administrator.myapplication I/------------------﹕ onCreateView name= RelativeLayout

08-22 06:42:53.430 1699-1699/com.example.administrator.myapplication I/------------------﹕ onCreateView name= com.example.administrator.myapplication.PsSelectMenu

08-22 06:42:53.430 1699-1699/com.example.administrator.myapplication I/------------------﹕ onCreateView name= RelativeLayout

08-22 06:42:53.430 1699-1699/com.example.administrator.myapplication I/------------------﹕ onCreateView name= TableRow

08-22 06:42:53.430 1699-1699/com.example.administrator.myapplication I/------------------﹕ onCreateView name= TextView

08-22 06:42:53.430 1699-1699/com.example.administrator.myapplication I/------------------﹕ onCreateView name= ImageView

08-22 06:42:53.430 1699-1699/com.example.administrator.myapplication I/------------------﹕ onCreateView name= RelativeLayout

08-22 06:42:53.430 1699-1699/com.example.administrator.myapplication I/------------------﹕ onCreateView name= TableRow

08-22 06:42:53.430 1699-1699/com.example.administrator.myapplication I/------------------﹕ onCreateView name= TextView

08-22 06:42:53.430 1699-1699/com.example.administrator.myapplication I/------------------﹕ onCreateView name= ImageView

08-22 06:42:53.430 1699-1699/com.example.administrator.myapplication I/------------------﹕ onCreateView name= RelativeLayout

08-22 06:42:53.430 1699-1699/com.example.administrator.myapplication I/------------------﹕ onCreateView name= TableRow

08-22 06:42:53.430 1699-1699/com.example.administrator.myapplication I/------------------﹕ onCreateView name= TextView

08-22 06:42:53.430 1699-1699/com.example.administrator.myapplication I/------------------﹕ onCreateView name= ImageView

08-22 06:42:53.440 1699-1699/com.example.administrator.myapplication I/dalvikvm-heap﹕ Grow heap (frag case) to 3.598MB for 635808-byte allocation

08-22 06:42:53.470 1699-1699/com.example.administrator.myapplication I/------------------﹕ onStart

08-22 06:42:53.470 1699-1699/com.example.administrator.myapplication I/------------------﹕ onResume

08-22 06:42:54.020 1699-1699/com.example.administrator.myapplication W/EGL_emulation﹕ eglSurfaceAttrib not implemented

可以看到这个方法才是最先开始执行的,是用于加载View,加载由顶至下,由父到子,直至所有的view加载结束,可以用于监听View的加载过程,做一些需要的处理工作。Xml里面的布局是在oncreat()方法里面用setContentView的方法加载进去的,所以从上面日志可以看到,oncreat 方法执行之后才会加载我们setcontenView()加载进去的view,之前的调用oncreatview()只是加载最初级的容器。在与用户交互的时候,可能会多次调用到这个方法,所以尽量不要在这里做处理。

切换到home 时:

03-27 09:05:40.986 26348-26348/com.example.administrator.myapplication I/------------------﹕ onPause

03-27 09:05:41.526 26348-26348/com.example.administrator.myapplication I/------------------﹕ onStop

再次进入到应用的时候:

03-27 09:15:43.564 26348-26348/com.example.administrator.myapplication I/------------------﹕ onStart

03-27 09:15:43.564 26348-26348/com.example.administrator.myapplication I/------------------﹕ onResume

切换到home后,按一键清理重新点进进入应用,发现相当于重新启动了(一定要注意这点,所以要在onpause里保存相应的数据):

03-27 09:39:36.562 9670-9670/com.example.administrator.myapplication I/------------------﹕ onCreateView name= android.support.v7.internal.widget.NativeActionModeAwareLayout

03-27 09:39:36.562 9670-9670/com.example.administrator.myapplication I/------------------﹕ onCreateView name= android.support.v7.internal.widget.ActionBarContainer

03-27 09:39:36.562 9670-9670/com.example.administrator.myapplication I/------------------﹕ onCreateView name= android.support.v7.widget.Toolbar

03-27 09:39:36.632 9670-9670/com.example.administrator.myapplication I/------------------﹕ onCreateView name= RelativeLayout

03-27 09:39:36.632 9670-9670/com.example.administrator.myapplication I/------------------﹕ onCreateView name= TableRow

03-27 09:39:36.632 9670-9670/com.example.administrator.myapplication I/------------------﹕ onCreateView name= TextView

03-27 09:39:36.642 9670-9670/com.example.administrator.myapplication I/------------------﹕ onCreateView name= ImageView

03-27 09:39:36.642 9670-9670/com.example.administrator.myapplication I/------------------﹕ onCreateView name= RelativeLayout

03-27 09:39:36.642 9670-9670/com.example.administrator.myapplication I/------------------﹕ onCreateView name= TableRow

03-27 09:39:36.642 9670-9670/com.example.administrator.myapplication I/------------------﹕ onCreateView name= TextView

03-27 09:39:36.642 9670-9670/com.example.administrator.myapplication I/------------------﹕ onCreateView name= ImageView

03-27 09:39:36.652 9670-9670/com.example.administrator.myapplication I/------------------﹕ onCreateView name= RelativeLayout

03-27 09:39:36.652 9670-9670/com.example.administrator.myapplication I/------------------﹕ onCreateView name= TableRow

03-27 09:39:36.652 9670-9670/com.example.administrator.myapplication I/------------------﹕ onCreateView name= TextView

03-27 09:39:36.652 9670-9670/com.example.administrator.myapplication I/------------------﹕ onCreateView name= ImageView

03-27 09:39:36.662 9670-9670/com.example.administrator.myapplication I/------------------﹕ onCreateView name= Button

03-27 09:39:36.672 9670-9670/com.example.administrator.myapplication I/------------------﹕ onCreateView name= TextView

03-27 09:39:36.732 9670-9670/com.example.administrator.myapplication I/------------------﹕ onStart

03-27 09:39:36.732 9670-9670/com.example.administrator.myapplication I/------------------﹕ onResume
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: