Activity活动(中)

Activity使用

1、创建Activity

   1)定义类继承自Activity类;

   2)在清单文件中Application节点中声明<activity>节点;

<span style="font-family:FangSong_GB2312;font-size:18px;"><span style="font-family:FangSong_GB2312;"><activity
            android:name="com.itheima.activity.MainActivity"
            android:label="@string/app_name" >
            <!-- 程序的入口,LAUNCHER表示桌面快捷方式,进入的是此Activity -->
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />  <!—启动时,默认匹配 --
            </intent-filter>
</activity>
</span></span>

2、启动Activity

   通过意图(Intent)来启动一个Activity;

    1)  显示启动:显示启动一般用于自己调用自己的情况(在当前应用找),这样的启动方式比较快速,创建Intent后指定包名和类名;

<span style="font-family:FangSong_GB2312;font-size:18px;"><span style="font-family:FangSong_GB2312;">Intent intent = new Intent(this, OtherActivity.class);
startActivity(intent);		// 启动新的Activity
<pre name="code" class="java">Intent intent = new Intent();
intent.setClassName("com.itheima.activity", "com.itheima.activity.OtherActivity");	// 包名、全类名
startActivity(intent);		// 启动新的Activity
</span></span>
   2)隐式启动:一般用于调用别人的Activity,创建Intent后指定动作和数据以及类型
<span style="font-family:FangSong_GB2312;font-size:18px;"><span style="font-family:FangSong_GB2312;">Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);						// 设置动作
intent.setData(Uri.parse("tel://123456"));					// 设置数据// 网页
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://192.168.1.45:8080/androidWeb"));
	// 音频/视频,设置type
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("file:///mnt/sdcard/daqin.mp3"), "audio/*");	// 设置数据和数据类型,将启动音频播放器(vedio)
</span></span>

  3)为隐式启动配置意图过滤器:

      显式意图是指在创建意图时指定了组件,而隐式意图则不指定组件,通过动作、类型、数据匹配对应的组件;

      在清单文件中定义<activity>时需要定义<intent-filter>才能被隐式意图启动;

      <intent-filter>中至少配置一个<action>和一个<category>,否则无法被启动;

     Intent对象中设置的actioncategorydata在<intent-filter>必须全部包含Activity才能启动;

     <intent-filter>中的<action>、<category>、<data>都可以配置多个,Intent对象中不用全部匹配,每样匹配一个即可启动;(修改:也就是说Intent中有的<intent-filter>中都    要有,而<intent-filter>中有的Intent中不必有)

   如果一个意图可以匹配多个Activity,Android系统会提示选择;

<span style="font-family:FangSong_GB2312;font-size:18px;"><span style="font-family:FangSong_GB2312;"><!-- 注册 Activity, lable 表示Activity的标题 -->
        <activity
            android:name="com.itheima.activity.OtherActivity"
            android:label="OtherActivity" >
            <!-- 配置隐式意图,匹配http -->
            <intent-filter>
                <action android:name="android.intent.action.VIEW" /> 		<!—必须,表示动作为View -->
                <data android:scheme="http" /> 							<!—http开头-->				 	
                <category android:name="android.intent.category.DEFAULT" /> <!-- 必须,表示启动时,默认匹配 -->
            </intent-filter>
            <!-- 匹配tel -->
             <intent-filter>
                <action android:name="android.intent.action.CALL" /> 			
                <data android:scheme="tel" /> 											 	
                <category android:name="android.intent.category.DEFAULT" /> <!-- 必须,表示启动 -->
            </intent-filter>
            <!-- 匹配 音频、视频 -->
            <intent-filter>
                <action android:name="android.intent.action.VIEW" /> 			 
                <data android:scheme="file" android:mimeType="audio/*" /> 	<!—文件协议l类型 -->										 	
                <data android:scheme="file" android:mimeType="video/*" /> 			
                <category android:name="android.intent.category.DEFAULT" /> <!-- 必须,表示启动 -->
  </intent-filter>
 </activity>
</span></span>

3、启动时传递数据

   可通过意图Intent对象实现Activity之间的数据传递;

   使用Intent.putExtra()方法装入一些数据, 被启动的Activity可在 onCreate方法中getIntent()获取;

   可传输的数据类型: a.基本数据类型(数组), b. String(数组),  c. Bundle(Map),   d. Serializable(Bean), e.Parcelable(放在内存一个共享空间里);

基本类型:

<span style="font-family:FangSong_GB2312;font-size:18px;"><span style="font-family:FangSong_GB2312;">Intent intent = new Intent(this, OtherActivity.class);
intent.putExtra("name", "张飞");		// 携带数据
intent.putExtra("age", 12);
startActivity(intent);
</span></span>

一捆数据:

<span style="font-family:FangSong_GB2312;font-size:18px;"><span style="font-family:FangSong_GB2312;">Intent intent = new Intent(this, OtherActivity.class);
Bundle b1 = new Bundle();
b1.putString("name", "赵云");
b1.putInt("age", 25);
Bundle b2 = new Bundle();
b2.putString("name", "关羽");
b2.putInt("age", 44);
intent.putExtra("b1", b1);
intent.putExtra("b2", b2);
</span></span>

序列化对象(须实现序列化接口):

<span style="font-family:FangSong_GB2312;font-size:18px;"><span style="font-family:FangSong_GB2312;">Intent intent = new Intent(this, OtherActivity.class);
Person p = new Person("张辽", 44);
intent.putExtra("p", p);
</span></span>

接收数据:

       在OtherActivity 的onCreate()方法,通过 getIntent().get 相关的数据的方法来获取数据;

4、关闭时返回数据

   基本流程:

       使用startActivityForResult(Intentintent,int requestCode) 方法打开Activity;

       重写onActivityResult(int requestCode,intresultCode, Intent data) 方法;

       新Activity中调用setResult(int resultCode, Intent data) 设置返回数据之后,关闭Activity就会调用上面的onActivityResult方法;

    注意:

         新的Activity的启动模式不能设置成singleTask(如果已创建,会使用以前创建的)与singleInstance(单例,单独的任务栈),

         不能被摧毁(执行不到finish方法),父Activity中的 onActivityResult方法将不会执行;

          finish():表示关闭当前Activity,会调用onDestroy方法;

<span style="font-family:FangSong_GB2312;font-size:18px;"><span style="font-family:FangSong_GB2312;">public void openActivityB(View v) {
		Intent intent = new Intent(this, Activity_B.class);
		Person p = new Person("张辽", 44);
		intent.putExtra("p", p);
		startActivityForResult(intent, 100);						// 此方法,启动新的Activity,等待返回结果, 结果一旦返回,自动执行onActivityResult()方法
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if(data == null) {									// 没有数据,不执行
			return;
		}
		System.out.println(requestCode + ", " + resultCode);		// code 可用来区分,哪里返回的数据
		String name = data.getStringExtra("name");
		int age = data.getIntExtra("age", -1);
	}
</span></span>
<span style="font-family:FangSong_GB2312;font-size:18px;"><span style="font-family:FangSong_GB2312;">public void close(View v) {
		// == 关闭当前Activity时,设置返回的数据 ==
		Intent intent = new Intent();
		intent.putExtra("name", "典韦");
		intent.putExtra("age", 55);
		setResult(200, intent);	
		finish();				// 关闭,类似于点击了后退
	}
</span></span>













  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值