一、Activity生命周期(启动模式为默认的情况)
startActivity主要可以让目标界面入栈(移到栈顶)
导致:当前的Activity进入stop状态,目标界面将会从onCreate-->onStart-->onResume-->运行
返回键或者finish,会导致当前的Activity出栈(onPause-->onStop-->onDestroy)
Activity只要还在栈中但是不可见都处于onStop状态。
二、启动模式
android:launchMode="standard"默认
singleTop:如果目标已经在栈顶,则不再创建,而是触发该Activity的onNewIntent
singleTask:将目标页面放到新的栈中(Task),一般要结合android:taskAffinity="abc123",并且目标名称不能跟应用包名一样
singleInstance:将目标放到新栈中跟singleTask是类似的,只是跳转的目标如果在原来的栈中则将会在原来的基础上创建,如A B C在C中启动D(singleInstance),此时D在新的Task中,如果D->C 时原来的栈情况为A B C C
三、Fragment
Fragment是3.0之后新增的api,作用是依赖于Activity,为Activity分担一些界面交互/显示相关的事情,不能独立存在。
xml添加:
<fragment
android:layout_width="match_parent"
android:layout_height="200dip"
android:name="com.xyy.fragmentdemo.TitleFragment"/>
特性:跟Activity的生命周期同步
FragmentManager动态的管理:可以使用FragmentManager的beginTransation方法得到FragmentTransation对象来管理Fragment的add、remove、replace、show、hide、attach、dettach
管理方式如下:
ContentFragment fragment =ContentFragment.newInstance(str);
//Fragment的操作需要FragmentTransation
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
// ft.replace(R.id.content_layout,fragment); //处理替换(新的Fragment对象进来旧的出去)
ft.add(R.id.content_layout,fragment);
//将变化记录到回退栈
ft.addToBackStack("abc");
//提交操作
ft.commit();
注意:Fragment操作完成时需要commit或者commitAllowingStateLoss才有效果
使用FragmentTransation中的ft.addToBackStack("abc");的方法可以将操作的Fragment记录到回退栈中。
如果要获取回退栈的Fragment数量可以使用如下代码获取:
FragmentManager fm =getSupportFragmentManager();
//获取回退栈中Fragment的数量
int num = fm.getBackStackEntryCount();
Log.e("m_tag","num:"+num);
注意:如果有Fragment1嵌套了Fragment2这种情况,那么在Fragment1中获取FragmentManager时,需要使用getChildFragmentManager()这个方法,如果在Activity(FragmentActivity)中管理Fragment的管理器获取方式为getSupportFragmentManager(),在Activity中的其他Fragment里管理Activity中的Fragment那么FragmentManager的获取方式为:getFragmentManager()
*Fragment和Activity之间传递内容
Activity向Fragment传递:可以再Activity中使用FragmentManager的findFragmentById或者findFragmentByTag方法获取Fragment对象,然后通过fragment对象.方法()
Fragment向Activity中传递:可以再Fragment中使用getActivity()方法获取到所依赖的Activity对象,然后可以通过对象.方法传递
另外也可以在Fragment中设计一个回调interface,然后在需要返回数据的地方使用接口对象返回,然后Activity去实现即可
如:
Fragment中:
public void load() {
Log.e("m_tag", "加载数据...");
new Thread() {
@Override
public void run() {
super.run();
try {
Thread.sleep(10000);
} catch (InterruptedExceptione) {
e.printStackTrace();
}
//加载完了
if (null != onLoadListenr) {
onLoadListenr.onLoadOk("abc123");
}
}
}.start();
}
public interface OnLoadListenr {
void onLoadOk(Object result);
}
private OnLoadListenr onLoadListenr;
public void setOnLoadListenr(OnLoadListenr onLoadListenr) {
this.onLoadListenr = onLoadListenr;
}
Activity:
TitleFragment fragment = (TitleFragment)getSupportFragmentManager().findFragmentById(R.id.fragment_title);
fragment.setOnLoadListenr(new TitleFragment.OnLoadListenr() {
@Override
public void onLoadOk(Object result) {
Log.e("m_tag","Activity收到的内容:"+result);
}
});
===========================================================
四、Intent
-->ComponentName组件描述信息:可以描述Intent内容传递的目标组件。
应用内部跳转
Intentit = new Intent();
//通过组件名这个内容来配置Intent的目标
ComponentName cn = newComponentName(MainActivity.this,Activity01.class);
//ComponentName cn = newComponentName(MainActivity.this,"com.xyy.intentdemo.Activity01");
it.setComponent(cn);
startActivity(it);
跨应用跳转
Intent it1 = new Intent();
//第一个参数表示跳转到的目标应用,第二个参数表示跳转到的界面
ComponentName cn1 = newComponentName("com.xyy.webviewdemo","com.xyy.webviewdemo" +".MainActivity");
it1.setComponent(cn1);
startActivity(it1);
注意:跨应用跳转的目标必须是一个入口界面(Main,Send,View)
-->Action
Action:描述Intent内容传递的一些行为,一般结合intent-filter一起使用。
需要在组件(Activity、Service)声明的时候使用<intent-filter>标签添加行为过滤,如:
<activityandroid:name=".Activity01">
<intent-filter>
<actionandroid:name="abc123"/>
<categoryandroid:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
启动时可以配置Action字符串即可启动,如:
Intentit3 = new Intent("abc123");
//it3.setAction("abc123");
startActivity(it3);
-->Data和Type
Data和Type:描述Intent传递的数据和类型(Uri)
结合Action实现分享
需要分享界面(接收端)要有过滤
<activity
android:name=".ShareActivity"
android:label="那个啥">
<intent-filter>
<actionandroid:name="android.intent.action.SEND"/>
<actionandroid:name="android.intent.action.SENDTO"/>
<dataandroid:mimeType="text/*"/>
<dataandroid:mimeType="image/*"/>
<categoryandroid:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
发送端,使用数据以及类型组装一个Intent目标,然后列出选择
IntentshareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_TEXT,"Hello World");
//配置要找系统中能发送文本的Activity
//shareIntent.setType("text/plain");
Uri uri = Uri.fromFile(new File("/mnt/sdcard/temp.jpg"));
shareIntent.setDataAndType(uri,"image/jpeg");
//已选择框形式列出用户要分享到的Activity
Intent intent = Intent.createChooser(shareIntent,"分享到");
startActivity(intent);
-->Extras
Extras:(Bundle)传递的一些键值对数据(基本数据类型/String/序列化对象/序列化集合)。