Android基础——Activity的使用

来源:互联网 发布:小学生预防网络诈骗 编辑:程序博客网 时间:2024/05/18 01:45


1,Activity间的跳转:

这里涉及到了Android中另外一个特别重要的组件 Intent ,就像他的字面意思“意图,打算”一样,我们可以把它理解为我们想要去做的事。例如从ActivityA跳转到ActivityB,系统是怎么知道我们要跳转到ActivityB而不是ActivityC或其他的呢,就是通过 Intent 得知的。


这里涉及到两个Activity,一定要在AndroidManifest.xml文件中声明:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.flyingduck.activitydemo1"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk        android:minSdkVersion="8"        android:targetSdkVersion="17" />    <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:name="com.flyingduck.activitydemo1.ActivityA"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <activity android:name="com.flyingduck.activitydemo1.ActivityB" >        </activity>    </application></manifest>


ActivityA.java:


package com.flyingduck.activitydemo1;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class ActivityA extends Activity {private Button skipBtn;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_a_layout);skipBtn = (Button) findViewById(R.id.activity_a_skip_btn);skipBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(getApplicationContext(), ActivityB.class);Bundle arguments = new Bundle();arguments.putString("someData", "I'm from Activity A!");intent.putExtras(arguments);startActivity(intent);}});}}

这里Intent通过构造函数显式的指明了要跳转到的Activity。自然还有隐式的跳转方法,后面会涉及到。在ActivityA跳转的时候还绑定了一些数据在Intent中,这里是通过Bundle对象绑定的,Bundle类就像一个Map一样,我们可以将数据的键值对放入其中,在取出的时候就可以很轻易的通过键取到对应的值。当然,如果数据较少的话我们可以采用下面的代码完成数据的传递:

Intent intent = new Intent(getApplicationContext(), ActivityB.class);intent.putExtra(name, value);startActivity(intent);



ActivityB.java

ActivityB的布局也很简单,只有一个用于显示ActivityA传递过来数据的TextView

package com.flyingduck.activitydemo1;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.widget.TextView;public class ActivityB extends Activity {private TextView showTxt;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_b_layout);showTxt = (TextView) findViewById(R.id.activity_b_txt);Intent intent = getIntent();Bundle arguments = intent.getExtras();String text = arguments.getString("someData");//String text = intent.getStringExtra("someData");showTxt.setText(text);}}

这里通过getIntent()方法可以得到启动当前Activity的Intent,并从中取得数据。当然,取得方法也有两种,根据你绑定数据时方法而异。在取数据的时候也可以设置默认值:

arguments.getString(key, defaultValue);


效果图如下:




2:启动其他Activity并返回结果:

例子情景:在ActivityA中启动ActivityB,并且当从ActivityB回到ActivityA时,返回一些数据到ActivityA。这样便实现了两个Activity间的通信。


首先是配置文件AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.flyingduck.activitydemo1"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk        android:minSdkVersion="8"        android:targetSdkVersion="17" />    <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:name="com.flyingduck.activitydemo1.ActivityA"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <activity android:name="com.flyingduck.activitydemo1.ActivityB" >            <intent-filter>                <action android:name="com.flyingduck.activitydemo1.B_ACTION" />                <category android:name="android.intent.category.DEFAULT"/>            </intent-filter>        </activity>    </application></manifest>

可以注意到这里为ActivityB设置了<intent-filter>属性,它在隐式启动ActivityB时会起到作用。


ActivityA.java

为ActivityA的布局添加一个TextView用于接收返回的数据。

package com.flyingduck.activitydemo1;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class ActivityA extends Activity {private Button skipBtn;private TextView showReturnResult;public static final int REQUEST_CODE = 100;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_a_layout);skipBtn = (Button) findViewById(R.id.activity_a_skip_btn);showReturnResult = (TextView) findViewById(R.id.activity_a_txt);skipBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent();intent.setAction("com.flyingduck.activitydemo1.B_ACTION");Bundle arguments = new Bundle();arguments.putString("someData", "I'm from Activity A!");intent.putExtras(arguments);startActivityForResult(intent, REQUEST_CODE);}});}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if (requestCode == REQUEST_CODE && resultCode == ActivityB.RESULT_CODE) {String text = data.getExtras().getString("dataFromB");showReturnResult.setText(text);}}}

注意几点:

1,在创建Intent时,我们没有显式的指明要启动哪个Activity,而是设置了Intent的Action,这与在Manifest中Activity设置的action参数很像。这就意味着,当startActivity时,根据这个意图“intent”,去找到最相近的Activity并启动它。这就是Activity的基本概念。intent 及 intent-filter的用法以后会讲到。

2,这里启动ActivityA时用到的是startActivityForResult(),这表示我们想要从启动的Activity中得到返回数据。怎样得到返回的数据呢?我们需要重写onActivityResult(....)方法,参数中有一个Intent类型的data,返回的数据就封装在其中。

3,大家可能注意到了两个code,requestCode  和 resultCode。大家不要疑惑,因为在Android应用中可能不止一个Activity以这种方式工作,我们就可以根据requestCode和resultCode来区分此时返回的data是不是属于该Activity的。


ActivityB.java

package com.flyingduck.activitydemo1;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.widget.TextView;public class ActivityB extends Activity {private TextView showTxt;public static final int RESULT_CODE = 101;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_b_layout);//取得ActivityA中数据并显示在EditText中showTxt = (TextView) findViewById(R.id.activity_b_txt);Intent intent = getIntent();Bundle arguments = intent.getExtras();String text = arguments.getString("someData");showTxt.setText(text);arguments.clear();//修改取得的数据返回给ActivityAarguments.putString("dataFromB", "I'm from Activity B!");intent.putExtras(arguments);setResult(RESULT_CODE, intent);}}

被启动的ActivityB可以通过setResult(...)将数据返回给启动它的Activity。


效果图:



原创粉丝点击