配置Activity:
如果Activity所在的包与AndroidManifest.xml文件的<manifest></manifest>标签中通过 package属性指定的包名一致,则android:name属性的值可以直接设置为“.Activity名称”
<activity android:name=".SecondActivity"></activity>
开启Activity:startActivity()
在MainActivity的onCreate()方法中启动SecondActivity
显式意图:
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
隐式意图:
Intent intent = new Intent();
intent.setAction("cn.itcast.start_activity");//指启动Activity
startActivity(intent);
关闭Activity:finish()
IntentFilter
当发送一个隐式Intent后,Android系统会将他与程序中的每一个组件的过滤器进行匹配,匹配属性有 action、data、category,需要这三个属性都匹配成功才能唤起相应的组件。
action:用于指定Intent对象的动作
<intent-filter>
<action android:name="android.intent.action.EDIT"/>
<action android:name="android.intent.action.VIEW"/>
......
</intent-filter>
只要Intent携带的action与其中一个<intent-filter>标签中action的声明相同,action属性就匹配成功。
在清单文件中为Activity添加<intent-filter>标签时,必须添加action属性,否则隐式Intent无法开启该Activity。
data:指定数据的URI或者数据MIME类型他的值通常与Intent的action属性有关联。
<intent-filter>
<data android:mimeType="video/mpeg" android:scheme="http..."/>
<data android:mimeType="audio/mpeg" android:scheme="http..."/>
...
</intent-filter>
隐式Intent携带的data数据只要与IntentFilter中的任意一个data声明相同,data属性就匹配成功。
category:用于为action添加额外信息
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
.......
</intent-filter>
一个IntentFilter可以不声明category属性,也可以声明多个category属性。
隐式Intent中声明的category必须全部能够与某一个IntentFilter中的category匹配才算匹配成功。
IntentFilter中罗列的category属性数量必须大于或者等于隐式Intent携带的category属性数量时,category属性才能匹配成功。如果一个隐式Intent没有设置category属性,那么他可以通过任何一个IntentFilter(过滤器)的category匹配。
数据传递
putExtra():
send:
Intent intent = new Intent();
intent.setClass(MainActivity.this,SecondActivity.class); //设置跳转到的Activity
intent.putExtra("studentName","王晓明");
startActivity(intent);
get:
Intent intent = getIntent();
String name = intent.getStringExtra("studentName");
bundle类:
send:
Intent intent = new Intent();
intent.setClass(this,SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putString("account", "江小白");//封装到bundle对象中
intent.putExtras(bundle);//将bundle对象封装到intent对象中
startActivity(intent);
get:
Bundle bundle = getIntent().getExtras();
String account = bundle.getString("account");
数据回传
// first:
// 使用startActivityForResult方法开启SecondActivity,第1个参数是Intent对象,第2个参数是请求码,用于标识请求的来源。
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent,1);
// second:
Intent intent = new Intent();
intent.putExtra("data","Hello MainActivity");
setResult(2,intent);//在SecondActivity中添加返回数据
finish();
// SecondActivity被销毁之后在MainActivity中回调onActivityResult()方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1&&resultCode == 2){
String acquiredData= data.getStringExtra("data"); //获取回传的数据
Toast.makeText(MainActivity.this,acquiredData,Toast.LENGTH_SHORT).show();
}
}
启动模式
任务栈
任务栈:一种用来存放Activity实例的容器
特点:“先进后出”
操作:压栈和出栈
intent.setFlags():
standard模式
standard模式是Activity的默认启动方式,每启动一个Activity就会在栈顶创建一个新的实例
singleTop模式
singleTop模式会判断要启动的Activity实例是否位于栈顶,如果位于栈顶则直接复用,否则创 建新的实例;
复用时, onCreate、onStart不会被系统调用。方法 onNewIntent会被回调。
singleTask模式
singleTask模式下每次启动该Activity时,系统首先会检查栈中是否存在当前Activity实例,如 果存在则直接使用,并把当前Activity之上的所有实例全部出栈。
singleInstance模式
singleInstance模式会启动一个新的任务栈来管理Activity实例,无论从哪个任务栈中启动该 Activity,该实例在整个系统中只有一个。
Fragment
Fragment(碎片)是一种可以嵌入在Activity中的UI片段,它可以用来描述Activity中的一部分布局。
Fragment不能独立存在,必须嵌入到Activity中使用。
public class NewsListFragment extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment, container, false);
//第一个参数表示Fragment对应的布局资源ID,
//第二个参数表示存放Fragment布局的ViewGroup,
//第三个参数表示是否在创建Fragment的布局时附加到ViewGroup上。
return v;
}
}
在Activity中动态添加Fragment的步骤:
- a)创建需要创建一个Fragment的实例对象。
- b)获取FragmentManager(Fragment管理器)的实例。
- c)开启FragmentTransaction(事务)。
- d)向Activity的布局容器(一般为FrameLayout)中添加Fragment。
- e)通过commit()方法提交事务。
//实例化fragment对象
NewsListFragment fragment = new NewsListFragment();
//获取FragmentManager实例
FragmentManager fm = getFragmentManager();
//开启事务
FragmentTransaction beginTransaction = fm.beginTransaction();
//添加Fragment
beginTransaction.replace(R.id.ll,fragment);
//提交事务
beginTransaction.commit();
在layout中添加fragment:
public class SecondFragment extends Fragment implements View.OnClickListener {
Button button;
TextView textView;
public SecondFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// 获得代表fragment布局文件的view
View view =inflater.inflate(R.layout.fragment_second, container, false);
textView=view.findViewById(R.id.textView);
button=view.findViewById(R.id.button);
button.setOnClickListener(this);
return view;
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.button:
//获取同一Activity中 当前已存在的 Fragment对象
FirstFragment fragment=(FirstFragment)this.getFragmentManager().findFragmentById(R.id.firstFragment);
//通过FirstFragment的View获取textView
TextView textView=fragment.getView().findViewById(R.id.textView);
this.textView.setText(textView.getText().toString());
}
}
//获取textView
public TextView getTextView() {
return textView;
}
}