Android08
隐式意图和显式意图
显式意图
intent.setClass(MainActivity.this, CalcActivity.class); Intent intent = new Intent(this, ResultActivity.class); intent.setClassName("com.itheima.twointent", "com.itheima.twointent.Activity01");
隐式意图
<activity android:name="com.itheima.twointent.Activity01" > </activity> <activity android:name="com.itheima.twointent.Activity02" > <intent-filter> <action android:name="com.itheima.twointent.OPEN02" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> //隐式意图 public void start02(View view) { Intent intent = new Intent(); intent.setAction("com.itheima.twointent.OPEN02"); intent.addCategory("android.intent.category.DEFAULT"); startActivity(intent); }
显式意图和隐式意图的特点
- 是否需要配置清单文件意图过滤器 显式(不需要) 隐式(需要)
- 是否能够被其他的应用程序启动 显式(不能够) 隐式(可以)
- 启动效率 显式(高) 隐式(低)
- 实际应用场景 显式(多) 隐式(少)
隐式意图的详细参数
<activity android:name="com.itheima.intentdemo.DemoActivity">
<intent-filter >
<action android:name="com.itheima.intentdemo.XXXX"/>
<data android:mimeType="text/plain" />
<data android:scheme="itheima"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
public void click(View view){
Intent intent = new Intent();
//action 动作
//泡茶 泡妞
intent.setAction("com.itheima.intentdemo.XXXX");
intent.addCategory(Intent.CATEGORY_DEFAULT);
// intent.setData(Uri.parse("itheima://afaf"));
// intent.setType("text/plain");
intent.setDataAndType(Uri.parse("itheima://afaf"), "text/plain");
startActivity(intent);
}
利用隐式意图打开系统的浏览器
// <intent-filter>
// <action android:name="android.intent.action.VIEW" />
// <category android:name="android.intent.category.DEFAULT" />
// <category android:name="android.intent.category.BROWSABLE" />
// <data android:scheme="http" />
// <data android:scheme="https" />
// <data android:scheme="about" />
// <data android:scheme="javascript" />
//</intent-filter>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.tv_link).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//激活系统的另外一个应用程序.
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");//可以只写一个,写后面的一个
intent.addCategory("android.intent.category.DEFAULT");
intent.addCategory("android.intent.category.BROWSABLE");//category要写2个对应
intent.setData(Uri.parse("http://www.itheima.com"));//scheme只写一个
startActivity(intent);
}
});
}
利用隐式意图激活短信发送的应用
// <intent-filter>
// <action android:name="android.intent.action.VIEW" />
// <action android:name="android.intent.action.SENDTO" />
// <category android:name="android.intent.category.DEFAULT" />
// <category android:name="android.intent.category.BROWSABLE" />
// <data android:scheme="sms" />
// <data android:scheme="smsto" />
// </intent-filter>
public void click(View view) {
for (int i = 0; i < 100; i++) {
Intent intent = new Intent();
intent.setAction("android.intent.action.SENDTO");
intent.addCategory("android.intent.category.DEFAULT");
intent.addCategory("android.intent.category.BROWSABLE");
intent.setData(Uri.parse("smsto:"));
intent.putExtra("sms_body",
"推荐你使用一款软件,名字叫人品计算器,我测试出来的结果好准确呀,下载地址,http://bbs.itheima.com");
startActivity(intent);
}
}
短信助手的ui
public void selectSmsContent(View view) {
Intent intent = new Intent(this, SmsListActivity.class);
// startActivity(intent);
// 开启新的Activity并且获取返回值
startActivityForResult(intent, 1);
}
setContentView(R.layout.activity_smslist);
lv = (ListView) findViewById(R.id.lv);
lv.setAdapter(new ArrayAdapter<String>(this, R.layout.item, smsMessages));
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
System.out.println("我们开启的新的选择短信的界面被关闭了,结果数据返回到这里");
if (data != null) {
String message = data.getStringExtra("message");
et_message.setText(message);
}
}else if(requestCode == 2) {
System.out.println("我们开启的新的选择联系人界面被关闭了,结果数据返回到这里");
}
super.onActivityResult(requestCode, resultCode, data);
}
开启新的界面获取返回值
// 开启新的界面 选择联系人
public void selectContact(View view) {
Intent intent = new Intent(this, ContactListActivity.class);
// startActivity(intent);
// 开启新的Activity并且获取返回值
startActivityForResult(intent, 2);
}
setContentView(R.layout.activity_contactlist);
lv_contact = (ListView) findViewById(R.id.lv_contact);
lv_contact.setAdapter(new ArrayAdapter<String>(this, R.layout.item, objects));
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
System.out.println("我们开启的新的选择短信的界面被关闭了,结果数据返回到这里");
if (data != null) {
String message = data.getStringExtra("message");
et_message.setText(message);
}
}else if(requestCode == 2) {
System.out.println("我们开启的新的选择联系人界面被关闭了,结果数据返回到这里");
}
super.onActivityResult(requestCode, resultCode, data);
}
<activity android:name="com.itheima.smshelper.SmsListActivity" />
<activity android:name="com.itheima.smshelper.ContactListActivity" />
请求码和结果码
// 开启新的界面 选择短信内容
startActivityForResult(intent, 1);
setResult(0, data);//区分同一个Activity返回的不同数据
// 开启新的界面 选择联系人
startActivityForResult(intent, 2);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
System.out.println("我们开启的新的选择短信的界面被关闭了,结果数据返回到这里");
if (data != null) {
String message = data.getStringExtra("message");
et_message.setText(message);
}
}else if(requestCode == 2) {
System.out.println("我们开启的新的选择联系人界面被关闭了,结果数据返回到这里");
}
super.onActivityResult(requestCode, resultCode, data);
}
Activity的生命周期-创建和销毁
//当Activity被创建的时候调用的方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.out.println("oncreate");
}
//当Activity被销毁的时候调用的方法
@Override
protected void onDestroy() {
super.onDestroy();
System.out.println("onDestroy");
}
//打开页面和关闭页面,返回
Activity生命周期-显示与隐藏
//Activity界面用户可见的时候调用的方法
@Override
protected void onStart() {
System.out.println("onstart");
super.onStart();
}
//Activity界面用户不再可见的时候调用的方法.
@Override
protected void onStop() {
System.out.println("onstop");
super.onStop();
}
//打开页面和关闭页面,home建
Activity生命周期-暂停和继续
//获取焦点
@Override
protected void onResume() {
System.out.println("onresume");
super.onResume();
}
//失去焦点,暂停
@Override
protected void onPause() {
System.out.println("onpause");
super.onPause();
}
<activity
android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
<!--透明的视图-->
@Override
protected void onRestart() {
System.out.println("onrestart");
super.onRestart();
}
//当第一个调到第二个,在返回第一个页面时,第一个页面重新启动时,调用onRestart();
Activity生命周期的总结
Activity01—>Activity02—>Activity03
onCreate(创建) onStart(可见) onResume(获取焦点) onRestart(重新可见) onPause(失去焦点) onStop(不可见) onDestroy(销毁)
从Activity01—>Activity02 是
01onPause 02onCreate 02onStart 02onResume 01onStop
从Activity02—>Activity03 是
02onPause 03onCreate 03onStart 03onResume 02onStop
从Activity03—>Activity02 是返回 03onDestroy
03onPause 03onStop 03onDestroy 02onRestart(重新可见) 02onStart 02onResume
从Activity02 是 home 02onDestroy不销毁
02onPause 02onStop
横竖屏切换的生命周期
Activity横竖屏切换
在activity横竖屏切换的时候默认是销毁当前的activity,然后重新初始化activity
在清单文件里配置android:screenOrientation="portrait" portrait-->一直是竖屏 landspace --> 一直是横屏 固定activity的显示模式,这样就不会重走一次生命周期
或者配置
android:configChanges="keyboardHidden|screenSize|orientation"
这样的话就算横竖屏切换了,不会影响activity,也就不会重走一次生命周期
Activity的任务栈
- 就是栈中放的是任务(Activity活动),先进的Activity01,Activity02,Activity03,出是Activity03,Activity02,Activity01
singletop的启动模式
- standard 标准 (默认)
特点:当你通过startActivity() 启动的activity的实例的引用就会放置在任务栈 每次启动都会创建一个新的实例
singleTop 独占顶端
<activity android:name="com.itheima.launchmode.SecondActivity" android:launchMode="singleTop" > </activity>
singleTop独占顶端
特点:如果activity已经在栈顶,那么不会创建新的实例,而会复用栈顶的Activity. 如果不再栈顶,创建新的实例
singletask的启动模式
singleTask 单任务栈
特点:如果任务栈里面出现了activity,那么就会清空该activity上面所有的activity,再重用该Activity
singleinstance启动模式
singleInstance 单实例
特点:如果activity的启动模式设置了singleInstance 这样的activity会单独存放在一个任务栈里面。并且这样的实例只会有一份引用。