您的位置:首页 > 移动开发 > Android开发

android 四大应用主键之 --- Activity

2016-12-13 15:26 489 查看
描述:

1)表示用户交互的一个界面(活动),每一个activity对应一个界面

2)是所有View的容器:button,textview,imageview;我们在界面上看到的都是一个个的view

3)有个ActivityManager的管理服务类,用于维护与管理Activity的启动与销毁;---
Activity启动时,会把Activity的引用放入任务栈中

4)一个应用程序可以被别的应用程序的activity开启,此时,是将此应用程序的引用加入到了开启的那个activity的任务栈中了

5)
activity是运行在自己的程序进程里面的 --- 在一个应用程序中,可以申请单独的进程,让此应用程序中的一个组件在新的进程中运行

6)可以在activity里面添加permission标签,调用者必须加入这个权限
--- 与钱打交道的界面,都不允许被其他应用程序随意打开

如果觉得那个activity比较重要,可以在清单文件中配置,防止别人随意打开,需要配置一个权限

自定义权限:


在清单文件中配置permission,创建一个新的权限

创建后,就会在清单文件中生成这个权限了

此时,需要开启这个界面,就需要使用这个权限

 

1、创建Activity

1)定义类继承自Activity类;

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

<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>

 

2、启动Activity

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

1) 显示启动:

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

Intent intent = new Intent(this, OtherActivity.class);

startActivity(intent); // 启动新的Activity

或者:

Intent intent = new Intent();

intent.setClassName("com.itheima.activity", "com.itheima.activity.OtherActivity"); //
包名、全类名

startActivity(intent); // 启动新的Activity

2)隐式启动:

一般用于调用别人的Activity,创建Intent后指定动作和数据以及类型;

// 电话

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)

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

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

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

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

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

* <intent-filter>中的<action>、<category>、<data>都可以配置多个,Intent对象中不用全部匹配,每样匹配一个即可启动;

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

  <!-- 注册 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>

 

3、启动时传递数据

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

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

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

基本类型:

Intent intent = new Intent(this, OtherActivity.class);

intent.putExtra("name", "张飞"); //
携带数据

intent.putExtra("age", 12);

startActivity(intent);

一捆数据:

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);

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

Intent intent = new Intent(this, OtherActivity.class);

Person p = new Person("张辽", 44);

intent.putExtra("p", p);

接收数据:

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

 

4、关闭时返回数据

基本流程:

l 使用startActivityForResult(Intent intent,
int
 requestCode) 方法打开Activity;

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

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

注意:新的Activity的启动模式不能设置成
singleTask(如果已创建,会使用以前创建的)与singleInstance(单例,单独的任务栈),不能被摧毁(执行不到finish方法),父Activity中的
onActivityResult方法将不会执行;

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

Activity_A:

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);

}

Activity_B:

public void close(View v) {

// == 关闭当前Activity时,设置返回的数据 ==

Intent intent = new Intent();

intent.putExtra("name", "典韦");

intent.putExtra("age", 55);

setResult(200, intent);

finish(); // 关闭,类似于点击了后退

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: