赞
踩
第一种设置方式(常用):需要在清单文件中为继承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的类名或者字节码文件
隐式意图:一般用来开启第三方的界面,如果一个应用希望被别的应用开启,就在自己的清单文件当中定义IntentFillter这样的节点,如果不希望被开启,就不定义意图过滤器
显示意图:开启本应用所在的的界面,用显示意图
例如:
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 是用来分类的,用哪个都可以
就像一个人
开启第二个界面
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的四种启动模式:
standard:标准启动模式,也是默认的启动模式,正常的出栈进栈
SingleTop:如果当前开启的界面已经在最上面,那么就复用这个对象,就不再创建新的activity了
使用实例:browser中的书签页面,节省内存的做法
SingleTask:如果当前任务栈中已有这个activity,那么就将他上面的所有activity干掉
也是浏览器 BrowserActivity 也是节省内存
SingleInstance 那么就新开启一个任务栈,单独存放这个activity(02),并且这个任务栈中有且仅有这一个对象
当点击返回键时,必须是当前栈中所有的activity都消亡后,才切换任务栈
公用界面,来点界面,一般都会使用这种开启模式,有道词典,金山词典,公共界面会单独放置在一个任务栈
43
AsyncHttpClient client = new AsyncHttpClient();
client.get(url,回调接口)
client.post(url,RequestParameters,回调接口)
用对话框的时候,一定要用Activity,因为对话框是依附在Activity上的
Dialog dialog = new Dialog(MainActivity.this);
如果传递getApplicationcontext()会报错 对话框必须依附在一个Activity上
其他时候:
吐司的话用什么都可以
建议用控件的时候 TextView tv = new TextView(MainActivity.this)
区别在于生命周期长度不一样
应用开启时,先开启的Application,其次才有了各个activity
肯定Activity至少要在Application的前面,或者同时消亡
Application的生命周期更长一点
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。