网上看见大牛们的博客写的那样精彩,各类羡慕之情溢于言表。几回冲动均想效仿牛人写些博客来记录下本身的心得体会,但均无感亦或是感受容易被喷,相信不少菜鸟和我同样都有过这样的担心。万事开头难,不逼一下本身怎么知道本身能不能飞起来。因为本人处于初学阶段,写此博客仅是对前辈总结的review,对本身记忆的加深及后续使用的方便查找。请各位看官将就看看,手下留情。在此谢过!有错的地方或者更好的心得体会欢迎随时骚扰!java
Android中常说的四大组件包括:Activity、Service、Broadcast、Content Providerandroid
其中最基础也是最多见的就是今天review的主题:Activityide
Activity存在的意义:用户与Android系统的交互的途径布局
老套路先上经典的生命周期图:动画
Activity的生命周期主要由上述8个方法组成this
在该方法中咱们能够作一些初始化的相关操做spa
在该方法中能够作如下操做:
1: 储存数据
2: 中止动画
onStop:表示Acitivity正在中止或者即将被销毁
onDestroy:表示Activity的销毁, 所作的操做和onCreate正好相反
PS: 耗时操做不要放到onPause或onStop中3d
当用户转动屏幕时,Activity销毁并重建的过程以下:code
onPause()->onSaveInstanceState()->onStop()->onDestory()->onCreate()->onStart()->onRestoreInstanceState()->onResume()xml
系统自带的控件, 如TextView的文本内容Android系统会帮咱们保存和恢复
App的状态, 则须要咱们本身在onSaveInstanceState和onRestoreInstanceState中保存和恢复
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Log.i(TAG, "onSaveInstanceState"); outState.putString(BUNDLE_DATA, "xyz"); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); Log.i(TAG, "onRestoreInstanceState: " + savedInstanceState.getString(BUNDLE_DATA)); }
咱们可否在系统配置更新时, 本身对Activity的生命周期进行控制呢?
答案是能够的, android提供了这样的机制
咱们在AndroidManifest.xml中的Activity描述中添加以下配置
android:configChanges="orientation|screenSize"
再次旋转屏幕看看, Activity并无销毁和重建了
与Activity生命周期息息相关的是Activity启动模式,不一样的启动模式,致使的Activity生命周期则不一样。
Activity有以下4种启动模式:
1: standard
Step 1: (standard launch)FirstActivity
Current Task Stack:
++++FirstActivity
Step 2: (standard launch)SecondActivity
Current Task Stack:
++++SecondActivity
++++FirstActivity
Step 3: (standard launch)FirstActivity
Current Task Stack:
++++FirstActivity
++++SecondActivity
++++FirstActivity
standard下: 老是会新建一个Activity入栈
Standard,默认的启动模式,只要激活了Activity,就会建立一个新的实例,并放入任务栈中,这样任务栈中可能同时存在一个Activity的多个实例。
2: singleTop
Step 1: (standard launch)FirstActivity
Current Task Stack:
++++FirstActivity
Step 2: (standard launch)SecondActivity
Current Task Stack:
++++SecondActivity
++++FirstActivity
Step 3: (singleTop launch)SecondActivity
Current Task Stack:
++++SecondActivity
++++FirstActivity
singleTop下: 若是栈顶是该Activity, 则不新建, 若是栈顶不是该Activity, 则新建该Activity
SingleTop,激活Activity时,若是栈顶是Activity,就不会建立新的实例,若是栈顶不是这个Activity,则会建立新的实例对象。
3: singleTask
Step 1: (standard launch)FirstActivity
Current Task Stack:
++++FirstActivity
Step 2: (standard launch)SecondActivity
Current Task Stack:
++++SecondActivity
++++FirstActivity
Step 3: (singleTask launch)FirstActivity
Current Task Stack:
++++FirstActivity
singleTask下: 若是栈里已经存在该Activity, 即pop到该Activity, 若是栈里没有该Activity, 则新建Activity
singleTask,若是栈中存在Activity的实例,则将栈中该实例以上的其余Activity的实例移除,让该Activity的实例处于栈顶,若是栈中不存在该实例,则建立新的实例。
4: singleInstance
Step 1: (standard launch)FirstActivity
Current Task Stack:
++++FirstActivity
Step 2: (singleInstance launch)ThirdActivity
Current Task Stack:
++++FirstActivity ++++ThirdActivity
Step 3: (standard launch)SecondActivity
Current Task Stack:
++++SecondActivity
++++FirstActivity ++++ThirdActivity
singleInstance下: 会新开一个栈, 单独放置该Activity
多个应用共享Activity的一个实例,不管是否是同一个应用,只要是激活该Activity,都重用这个实例。
1.Activity注册
1 // in AndroidManifest.xml 2 <activity android:name=".SecondActivity" > 3 </activity>
2.Activity之Intent
1 // in FirstActivity.java 2 @Override 3 protected void onCreate(Bundle savedInstanceState) { 4 super.onCreate(savedInstanceState); 5 setContentView(R.layout.activity_first); 6 Button standardButton = (Button) findViewById(R.id.standard_button); 7 standardButton.setOnClickListener(new OnClickListener() { 8 @Override 9 public void onClick(View arg0) { 10 Intent intent = new Intent(FirstActivity.this, 11 SecondActivity.class); 12 startActivity(intent); 13 } 14 }); 15 }
3.Activity之Intent-Filter
1 //in mainifest.xml 2 <intent-filter> 3 <action android-name="android.intent.action.MAIN" /> 4 <category android-name="android.intent.category.LAUNCHER" /> 5 </intent-filter>
4.Activity间通讯: FirstActivity -> SecondActivity
1 // in FirstActivity.java 2 public static final String EXTRA_DATA = "extra_data"; 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_first); 7 Button standardButton = (Button) findViewById(R.id.standard_button); 8 standardButton.setOnClickListener(new OnClickListener() { 9 @Override 10 public void onClick(View arg0) { 11 Intent intent = new Intent(FirstActivity.this, 12 SecondActivity.class); 13 intent.putExtra(EXTRA_DATA, "cba"); 14 startActivityForResult(intent, REQUEST_CODE); 15 } 16 }); 17 } 18 // in SecondActivity.java 19 @Override 20 protected void onCreate(Bundle savedInstanceState) { 21 super.onCreate(savedInstanceState); 22 setContentView(R.layout.activity_second); 23 Intent intent = getIntent(); 24 Toast.makeText( 25 SecondActivity.this, 26 "Data from FirstActivity: " 27 + intent.getStringExtra(FirstActivity.EXTRA_DATA), 28 Toast.LENGTH_LONG).show(); 29 }
5.Activity间通讯: SecondActivity -> FirstActivity
1 // in FirstActivity.java 2 protected void onCreate(Bundle savedInstanceState) { 3 super.onCreate(savedInstanceState); 4 setContentView(R.layout.activity_first); 5 Button standardButton = (Button) findViewById(R.id.standard_button); 6 standardButton.setOnClickListener(new OnClickListener() { 7 @Override 8 public void onClick(View arg0) { 9 Intent intent = new Intent(FirstActivity.this, 10 SecondActivity.class); 11 startActivityForResult(intent, REQUEST_CODE); 12 } 13 }); 14 } 15 // in SecondActivity.java 16 @Override 17 protected void onResume() { 18 super.onResume(); 19 Intent intent = new Intent(); 20 intent.putExtra(EXTRA_DATA, "abc"); 21 setResult(Activity.RESULT_OK, intent); 22 } 23 // in FirstActivity.java 24 @Override 25 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 26 if (resultCode != Activity.RESULT_OK) { 27 return; 28 } 29 switch (requestCode) { 30 case REQUEST_CODE: 31 Toast.makeText( 32 FirstActivity.this, 33 "Result from SecondActivity: " 34 + data.getStringExtra(SecondActivity.EXTRA_DATA), 35 Toast.LENGTH_LONG).show(); 36 break; 37 default: 38 break; 39 } 40 }
6.配置Activity启动模式
静态方式
即在AndroidManifest.xml中配置
android:launchMode="singleTop"
android:launchMode="singleTask"
android:launchMode="singleInstance"
动态方式
即在源码中配置
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);