A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小蔡来学java 中级黑马   /  2016-7-26 21:46  /  602 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

描述:
1)表示用户交互的一个界面(活动),每一个activity对应一个界面
2)是所有View的容器:button,textview,imageview;我们在界面上看到的都是一个个的view
3)有个ActivityManager的管理服务类,用于维护与管理Activity的启动与销毁;
Activity启动时,会把Activity的引用放入任务栈中
4)一个应用程序可以被别的应用程序的activity开启
        此时,是将此应用程序的引用加入到了开启的那个activity的任务栈中了
5) activity是运行在自己的程序进程里面的
        在一个应用程序中,可以申请单独的进程,然此应用程序中的一个组件在新的进程中运行
6)可以在activity里面添加permission标签,调用者必须加入这个权限
        与钱打交道的界面,都不允许被其他应用程序随意打开
如果觉得那个activity比较重要,可以在清单文件中配置,防止别人随意打开,需要配置一个权限
自定义权限:
在清单文件中配置permission,创建一个新的权限
        创建后,就会在清单文件中生成这个权限了
此时,需要开启这个界面,就需要使用这个权限
Tips:
        *不可使用中文文本,需要使用字符串,抽取出来
*声明之后,会在gen的目录下,多出来一个文件:Manifest的文件,系统也存在一个这样的文件


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、关闭时返回数据
基本流程:
使用startActivityForResult(Intent intent, int requestCode) 方法打开Activity;
重写onActivityResult(int requestCode, int resultCode, Intent data) 方法;
新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();                                // 关闭,类似于点击了后退
        }

5、生命周期
1)Acitivity三种状态
a.运行:activity在最前端运行;
b.停止:activity不可见,完全被覆盖;
c.暂停:activity可见,但前端还有其他activity<>,注意:在当前Activitiiy弹出的对话框是Activity的一部分,弹出时,不会执行onPause方法;
2)生命周期相关的方法(都是系统自动调用,都以 on 开头):
a.onCreate:        创建时调用,或者程序在暂停、停止状态下被杀死之后重新打开时也会调用;
b.onStart:                onCreate之后或者从停止状态恢复时调用;                                                         
c.onResume:        onStart之后或者从暂停状态恢复时调用,从停止状态恢复时由于调用onStart,也会调用onResume(界面获得焦点);
d.onPause:        进入暂停、停止状态,或者销毁时会调用(界面失去焦点);
e.onStop:                进入停止状态,或者销毁时会调用;
f.onDestroy:        销毁时调用;
g.onRestart:        从停止状态恢复时调用;

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马