创建activity
第一种设置方式(常用):需要在清单文件中为继承activity的类 配置一个activity标签:如下
第一种方式:隐士跳转(要设置意图过滤器)
结合源码
10-15 01:11:20.097: E/AndroidRuntime(3840): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=hahaha }
会报以上错误的原因是:
因为如果为任何一个个activity设置意图过滤器,默认都必须有一个categary,仅仅设置action,则会报上面的错误。
1、通过设置一组意图过滤器来开启界面,只要满足任何一组都行
前提条件是 你必须将意图过滤器当中的所有节点在Intent中设置好
<intent-filter>
<action android:name="hahaha" />
<data android:scheme="hehe" />
<!-- 不是一个桌面图标,所以一般都用默认的 -->
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<intent-filter>
<!-action节点的name属性可以随便更改名称->
<action android:name="zz.itcast.second" />
<!-设置数据类型,其中scheme是命名空间,即数据开头必须带有的字段,如果配置了data节点则必须在程序中设置相应的字段,如果不设置将会报错,一般都会设置在意图过滤器中设置data节点,不规范的下发也可以不带有该节点不会报错->
<data android:scheme="text" />
<!-- 一般若是不设置成桌面图标,所以都用默认的android.intent.category.DEFAULT -->
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
两种开启意图过滤器都可以,满足任何一个都行
//第一种意图过滤器
intent2.setAction("hahaha");
以下这行代码可写可不写,因为category是默认的
intent2.addCategory(Intent.CATEGORY_DEFAULT);
intent2.setData(Uri.parse("hehe:"+"aldfjads"));
//第二种意图过滤器
intent2.setAction("zz.itcast.second");
intent2.setData(Uri.parse("text:"+"你好第二个界面"));
一个activity 可以设置一个或多个意图过滤器,只要符合一个activity中的任何一个意图过滤器即可以开启该activity。
第二种方式:显示跳转(不用设置意图过滤器)
显示意图设置不用为每一个activity(其实也可以设置只是没有什么用处)在工程清单中设置意图过滤器。
/ /第一种写法,通过指定包名(应用的包名)和全类名(加上命名空间的类名)
//Intent intent2 = new Intent();
//getPackageName()属于Context的
// intent2.setClassName(getPackageName(), “zz.itcast.activity.SecondActivity”);//第二种写法 Intent intent2 = new Intent(this, SecondActivity.class); startActivity(intent2);
通过指定你要开启的Activity的类名或者字节码文件
显示意图和隐士意图的区别:
- 显示意图:主要应用于本应用中切换界面,所切换的目标界面不用设置过滤意图,即直接设置name即可。
隐式意图:一般用来开启第三方的界面,如果一个应用希望被别的应用开启,就在自己的清单文件当中定义IntentFillter这样的节点,如果不希望被开启,就不定义意图过滤器
显示意图:开启本应用所在的的界面,用显示意图
- 隐士意图:用来开启第三方的应用界面。
隐式意图传递数据(重要)
- 隐式意图传递数据,通过指定scechme来传递数据,即通过设置 setData()方式,所以在目标界面首先得到Uri的对象uri来得到对象。
例如:
1、数据从当前界面发送的目标activity
intent2.setAction(“zz.itcast.second”);
intent2.setData(Uri.parse(“text:”+”你好第二个界面”));startActivity(intent2);
2、在目标界面接受数据
Intent intent = getIntent();
Uri uri = intent.getData();//获取到定义了命名空间 协议 String scheme = uri.getScheme(); //拿到协议之后定义的数据,并显示 String data = uri.getSchemeSpecificPart(); tv.setText("scheme = "+scheme+",data = "+data);
显示意图传递数据
1、数据从当前界面发送的目标activity
Intent intent2 = new Intent(this, SecondActivity.class);
intent2.putExtra("dameinv", "你好,大美女");
startActivity(intent2);
2、在目标界面接受数据
String text = getIntent().getStringExtra("dameinv");
//在新的界面当中拿到开起界面带来的数据
tv.setText(text);
2、显示意图都可以传递哪些数据类型,
1、八大基本数据类型都可以传递
2、继承自serializiable的类型
3、继承自parcelable类型。
//区别: serializiable的类型可以序列化到硬盘上,parcelable可以存到内存上
信息回传
A(当前界面)–B(目标界面)在关闭时,将数据回传给A—-A
如果你想在A界面开启B界面,并且在B界面关闭的时候,回传数据给A界面
1.A界面在开启B界面的时候需要调用startActivityForRestult(intent,int requestCode)
2.在B界面关闭的时候,需要调用两个关键方法
a.先设置要回传的数据 setResult(int resultCode,Intent data);
b.将自己关闭 finish();
3.回调到A界面的onActivityResult(int requestCode,int resultCode,Intent data)
data就是B界面回传的数据
requestCode和resultCode 是用来分类的,用哪个都可以
3.Activity的生命周期
就像一个人
- 出生 onCreate()
- 上小学 onSchool()
- 上大学 onUnivercity()
- 上传智播客 onChuanzhi()
- 找工作 onWork()
- 找媳妇 onWife()
。。。 - 挂掉 onOver();
开启第二个界面
onCreate():activity创建的时候会回调到此
onStart():界面可见的时候回调
onResume():界面获取到焦点的时候回调
onPause():界面失去焦点的时候回调
onStop() :界面不可见的时候回调
onDestroy():Activity消亡的时候回调
界面开启:
onCreate():activity创建的时候会回调到此
onStart():界面可见的时候回调
onResume():界面获取到焦点的时候回调
界面关闭:
onPause():界面失去焦点的时候回调
onStop() :界面不可见的时候回调
onDestroy():Activity消亡的时候回调
界面后台化:
onPause():界面失去焦点的时候回调
onStop() :界面不可见的时候回调
A界面开启B界面
A onPause();
B onCreate();
B onStart()
B onResume();
A onStop();
B返回A:
B onPause();
A onStart();
A onResume();
B onStop();
B onDestroy();
结合透明界面
A—开启B(B是透明界面)
A onPause();
B onCreate();
B onStart()
B onResume();
B(透明界面,返回A)
B onPause();
A onResume();
B onStop();
B onDestroy();
横竖屏切换的生命周期
横竖屏切换后,
onPause():界面失去焦点的时候回调
onStop() :界面不可见的时候回调
onDestroy():Activity消亡的时候回调
onCreate():activity创建的时候会回调到此
onStart():界面可见的时候回调
onResume():界面获取到焦点的时候回调
可以把方向写死 portrait 半身肖像 写死为竖直方向 90%的应用都是写死的 不走生命周期
android:screenOrientation=”portrait”
写死为横屏 landscape 风景画,打游戏或者看视频 不走生命周期
android:screenOrientation=”landscape”
如果不想走生命周期方法,还想有切换效果
android:configChanges=”orientation|screenSize|keyboardHidden”
如果还想接受到屏幕旋转的回调
就复写此方法onConfigurationChanged()
任务栈的介绍(面试当中喜欢问)
队列:先进先出 两头开口 从A口进,从B口出
栈:先进后出 只有一头开口
任务栈: 也叫回退栈 安卓当中把所有的activity都放入到了任务栈当中
开启一个activity代表进栈
关闭一个activity代表出栈
当栈中的Activity都清空的时候,代表应用退出了
一般来说,一个应用都维护了一个任务栈,当前应用的任务栈就放了自己的activity
每个应用都有一个自己任务栈的taskId
这个ID是自增长的,不管是什么应用,不管应用是否重复,只要需要重新申请任务栈,id都会增长
只要手机重启,ID从新开始计算。
Activity的四种启动模式(和任务栈相关联)
activity的四种启动模式:
standard:标准启动模式,也是默认的启动模式,正常的出栈进栈
SingleTop:如果当前开启的界面已经在最上面,那么就复用这个对象,就不再创建新的activity了
使用实例:browser中的书签页面,节省内存的做法
SingleTask:如果当前任务栈中已有这个activity,那么就将他上面的所有activity干掉
也是浏览器 BrowserActivity 也是节省内存
SingleInstance 那么就新开启一个任务栈,单独存放这个activity(02),并且这个任务栈中有且仅有这一个对象
当点击返回键时,必须是当前栈中所有的activity都消亡后,才切换任务栈
公用界面,来点界面,一般都会使用这种开启模式,有道词典,金山词典,公共界面会单独放置在一个任务栈
AsyncHttpClient
43
AsyncHttpClient client = new AsyncHttpClient();
client.get(url,回调接口)
client.post(url,RequestParameters,回调接口)
getApplicationcontext()和MainActivity的区别
用对话框的时候,一定要用Activity,因为对话框是依附在Activity上的
Dialog dialog = new Dialog(MainActivity.this);
如果传递getApplicationcontext()会报错 对话框必须依附在一个Activity上
其他时候:
吐司的话用什么都可以
建议用控件的时候 TextView tv = new TextView(MainActivity.this)
区别在于生命周期长度不一样
应用开启时,先开启的Application,其次才有了各个activity
肯定Activity至少要在Application的前面,或者同时消亡
Application的生命周期更长一点