当前位置: 代码迷 >> Android >> 曾经的札记——android的学习笔记(Activity传参、四种启动模式、生命周期、屏幕横竖屏切换)
  详细解决方案

曾经的札记——android的学习笔记(Activity传参、四种启动模式、生命周期、屏幕横竖屏切换)

热度:289   发布时间:2016-05-01 11:06:51.0
曾经的笔记——android的学习笔记(Activity传参、四种启动模式、生命周期、屏幕横竖屏切换)

1、传参

???? public class MainActivity extends Activity {

??? @Override
??? protected void onCreate(Bundle savedInstanceState) {
??????? super.onCreate(savedInstanceState);
??????? setContentView(R.layout.activity_main);
??? }
???
??? public void openActivity(View v){
??? ?//Intent intent = new Intent();
??? ?// method 1>
??? ?//intent.setClassName(this, "com.peter.multiactivity.OtherActivity");//设置要激活的组件
??? ?
??? ?//设置要激活的组件
??? ?// method 2>
??? ?//intent.setClassName("com.peter.multiactivity",
??? ?// ???"com.peter.multiactivity.OtherActivity");该方法可以跨应用激活Activity
??? ?
??? ?// method 3>
??? ?//intent.setClass(this, OtherActivity.class);
??? ?
??? ?// method 4>
??? ?//intent.setComponent(new ComponentName(this, OtherActivity.class));
??? ?
??? ?//method 5>?
??? ?Intent intent = new Intent(this, OtherActivity.class);
??? ?Log.i("MainActivity", "new Intent(this, OtherActivity.class)");
??? ?
??? ?intent.putExtra("username", "zhengjj");
??? ?intent.putExtra("amount",25000);
??? ?//startActivity(intent);
??? ?startActivityForResult(intent, 100);
??? }

[email protected]
?protected void onActivityResult(int requestCode, int resultCode, Intent data) {
??String result = data.getStringExtra("returnData")+"; requestCode="+requestCode+";resultCode="+resultCode;
??Toast.makeText(getApplicationContext(),result, Toast.LENGTH_LONG).show();
??super.onActivityResult(requestCode, resultCode, data);
?}

--------------------------------------------

public class OtherActivity extends Activity {

[email protected]
?protected void onCreate(Bundle savedInstanceState) {
??super.onCreate(savedInstanceState);
??setContentView(R.layout.activity_other);
??TextView textView = (TextView)findViewById(R.id.showText);
??Intent intent = getIntent();
??String username = intent.getStringExtra("username");
??int amount = intent.getIntExtra("amount", 30000);
??textView.setText("username="+username+"; amount="+amount);
?}
?
?public void closeActivity(View v){
??Intent intent = new Intent();
??intent.putExtra("returnData", "{'username':'zhengjj','amount':30000}");
??setResult(20, intent);//设置返回数据
??finish();//关闭Activity(关闭窗口)
?}

================================================

启动模式默认是 android:launchMode="standard"

<activity android:name="com.peter.multiactivity.OtherActivity" android:label="@string/other_app" android:launchMode="singleTop" />

我们在开发项目的过程中,会涉及到该应用中多个Activity组件之间的跳转,或者夹带其它应用的可复用的Activity。例如我们可能希望跳转到原来某个Activity实例,而不是产生大量重复的 Activity。这样就需要我们为 Activity 配置特定的加载模式,而不是使用默认的加载模式。

Activity 有四种加载模式

[1] standard 模式

这是默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中。

[2] singleTop 模式

如果在任务的栈顶正好存在该Activity的实例,就重用该实例( 会调用实例的 onNewIntent() ),否则就会创建新的实例并放入栈顶,即使栈中已经存在该Activity的实例,只要不在栈顶,都会创建新的实例。

[3] singleTask 模式

如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的 onNewIntent() )。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈。如果栈中不存在该实例,将会创建新的实例放入栈中。

[4] singleInstance 模式

在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。

设置启动模式的位置在 AndroidManifest.xml 文件中 Activity 元素的 android:launchMode 属性。

?

使用Intent可以激活三种核心组件:活动、服务和广播接收者

意图分为显示意图和隐式意图

显示意图:通过调用setClass()或setComponet()设置组件的意图。给定了调用组件的名称。明确指定了要调用的组件是哪一个组件

? 主动关闭Activity,finish(); 而不是等待系统去完成。

隐式Intent:意图对像本身并不知道要传递给哪个组件,至于传递给哪个组件是由Android平台来决定的。==>没有明确指定组件名称的意图,系统会根据所设定的action、category和URI 数据类型找到最合适的组件来处理意图

================================================================

生命周期



1、当Activity在屏幕前台时(位于当前任务堆栈的顶部),它处于激活active或运行状态running,它可以响应用户操作;

?2、当Activity上面有另外一个Activity,上面的Activity没有完全覆盖它,或者上面的Activity是透明的,这时下方的Activity仍然对用户是可见的,下方的Activity就处于暂停状态paused。被暂停的Activity仍然对用户可见,并且是存活的状态(它保留着所有的状态和成员信息,并保持和窗口管理器的连接),如果系统处于内存不足时会杀死这个Activity。

3、当Activity完全被另一个Activity覆盖时则处于停滞状态stopping,它仍然保留所有的状态和成员信息,然而对用户是不可见的,所以当它的窗口被隐藏,如果其他地方需要内存,则系统常常会杀死这个Activity。

?

当Activity从一种状态切换到另一种状态是,会调用以下保护方法来通知这种变化。

onCreate(Buddle saveInstanceState)

onStart()?? onRestart()?? onResume()? onPause? onStop()?? onDestroy()

?

参考的Manifest.xml的代码

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
??? package="cn.itcast.life"
??? android:versionCode="1"
??? android:versionName="1.0" >

??? <uses-sdk android:minSdkVersion="8" />

??? <application
??????? android:icon="@drawable/ic_launcher"
??????? android:label="@string/app_name" >
??????? <activity
??????????? android:label="@string/app_name"
??????????? android:name=".MainActivity" >
??????????? <intent-filter >
??????????????? <action android:name="android.intent.action.MAIN" />

??????????????? <category android:name="android.intent.category.LAUNCHER" />
??????????? </intent-filter>
??????? </activity>
??????? <activity android:name=".PauseActivity" android:theme="@android:style/Theme.Dialog" />
??????? <activity android:name=".StopActivity" />
??? </application>

</manifest>

------------------------------------------------------

Activity的onSaveInstanceState()和onRestoreInstanceState()的方法

这两个方法并不是生命周期的方法,它们不同于onCreate() onPause等生命周期的方法,它们俩不一定会被触发。当应用遇到意外情况(如内存不足,与直接按下Home键)由系统销毁一个Activity时,onSaveInstanceState()会被调用,另外Activity由运行状态进入暂停状态或停止状态也会调用该方法。但是当用户主动销毁一个Activity是,例如在应用中按了返回键,onSaveInstanceState()就不会被调用。因为在这种情况下,用户的行为决定了不需要保存Activity的状态。一般来说onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。

?????? 另外当屏幕的方向发生了改变,Activity会被销毁并且被重新创建,如果你想在Activity被销毁前缓存一些数据,并且在Activity被重新创建后恢复缓存的数据,可以重写Activity的onSaveInstanceState()和onRestoreInstanceState()的方法。

public class MainActivity extends Activity {
?private String name;
[email protected]
?protected void onRestoreInstanceState(Bundle savedInstanceState) {
??name = savedInstanceState.getString("name");
??//被重新创建后恢复缓存的数据
??super.onRestoreInstanceState(savedInstanceState);
?}

[email protected]
?protected void onSaveInstanceState(Bundle outState) {
??outState.putString("name", "zhengjj");
??//被销毁前缓存一些数据
??super.onSaveInstanceState(outState);
?}

==================================================

屏幕横竖屏切换

参考的例子

http://www.cnblogs.com/zhangkai281/archive/2011/07/06/2099277.html?解决Android手机 屏幕横竖屏切换

  相关解决方案