1.Activity生命周期
启动状态 运行状态 暂停状态 停止状态 销毁状态
生命周期方法
onCreate() | Activity创建时调用 |
---|---|
onStart() | Activity即将可见时调用 |
onResume() | Activity获取焦点时调用 |
onPause() | Activity被其他Activity覆盖或屏幕锁屏时调用 |
onStop() | Activity对用户不可见时调用 |
onDestroy | Activity销毁时调用 |
onRestart() | Activity从停止到启动时调用 |
2.Activity的创建、配置、开启和关闭
1.创建-----一个Activity对应一个xml布局文件
2.配置
创建的每一个Activity都必须在清单文件中配置才生效
<activity
android:name=".MyActivity"
android:exported="false" />
3.开启和关闭Activity
(1)在MainActivity中添加按钮单击事件,让其跳转到MyActivity页面
(2)在MyActivity中添加按钮单击事件,关闭当前页面
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("MainActivity","调用onCreate方法");
Button btn = findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//创建Intent对象 跳转到MyActivity页面
Intent intent = new Intent(MainActivity.this,MyActivity.class);
startActivity(intent);
}
});
}
}
public class MyActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
Button btn1 = findViewById(R.id.btn_1);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//关闭当前页面
finish();
}
});
}
}
3.Intent和IntentFilter
使用 Intent 从一个Activity切换到另一个Activity
1.Intent
不仅可以指定当前组件执行的动作,还可以在不同组件之间数据传递
(1)显式Intent
直接指定目标组件
Intent intent = new Intent(A.this, B.class);
startActivity(intent);
(2)隐式Intent
action用来指定Intent对象的动作
在清单文件中为Activity添加 时,必须添加action属性。否则隐式Intent无法开启
<activity
android:name=".C"
android:exported="false">
<intent-filter>
<!-- name 不能与 Activity 重名-->
<action android:name="d" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
Intent intent1 = new Intent();
intent1.setAction("d");
startActivity(intent1);
2.IntentFilter
当发送一个隐式Intent后,Android系统会将它与程序中每一个组件的过滤器进行匹配,匹配属性有action、data、category,需要三个属性都匹配成功才能唤起相应组件。
- action属性匹配规则
action属性用来指定Intent对象的动作 - data属性匹配规则
data属性用来指定数据的URI或者数据MIME类型,它的值通常与Intent的action属性有关联。 - category属性匹配规则
category属性用于为action添加额外信息,一个interFilter可以不声明category属性,也可以声明多个category属性。
<intent-filter>
<action android:name="android.intent.action.EDIT"/>
······
<intent-filter>
标签中间可以罗列多个action属性,但是当使用隐式Intent激活组件时,只要Intent携带的action与其中一个标签中action的声明相同,action属性就匹配成功。
在清单文件中为Activity添加标签时,必须添加action属性,否则隐式Intent无法开启该Activity。
<intent-filter>
<data android:mimeType="Video/mpeg" android:scheme="http..."/>
···
</intent-filter>
标签中间可以罗列多个data属性,每个data属性可以指定数据的MIME类型和URI。其中MIME类型可以表示image/ipeg、video/*等媒体类型。
隐式Intent携带的data与其中一个标签中data的声明相同,data属性就匹配成功。
<intent-filter>
<category android:name="android.intent.category.DEFAULT"/>
······
</intent-filter>
隐式Intent中声明的category必须全部能够与某一个IntentFilter中的category匹配才算匹配成功。IntentFilter中罗列的category属性数量必须大于或者等于隐式Intent携带的category属性数量时,category属性才能匹配成功。如果一个隐式Intent没有设置category属性,那么它可以通过任何一个IntentFilter的category匹配。
4.Activity之间的跳转
1.putExtra()
通过putExtra()方法将传递的数据储存在Intent对象中
Intent intent = new Intent(MainActivity.this, FirstActivity.class);
intent.putExtra("name","王小明");
intent.putExtra("age",12);
intent.putExtra("isPassed",true);
startActivity(intent);
接收
// 接收数据并将数据显示在text1
Intent intent = getIntent();
String name = intent.getStringExtra("name");
int age = intent.getIntExtra("age", 0);
boolean isPassed = intent.getBooleanExtra("isPassed", true);
text1.setText(name + ":" + age + ":" + isPassed);
2.Bundle
使用Bundle传递数据
Intent intent1 = new Intent(MainActivity.this, SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putString("name","王小明");
bundle.putInt("age",12);
intent1.putExtras(bundle);
startActivity(intent1);
接收
// 接收数据并显示在text2
Bundle bundle = getIntent().getExtras();
String name = bundle.getString("name");
int age = bundle.getInt("age");
text2.setText(name + ":" + age);
3.Activity之间的数据回传
1.startActivityForResult()
用于开启一个Activity,当开启的Activity销毁时,希望从中返回数据。
requestCode表示请求码,用于标识请求来源。
2.setResult()
resultCode表示返回码,用于标识返回的数据来自哪个Activity。
intent用于携带数据并回传到上个界面。
3.onActivityResult()
用于接收回传的数据,并根据传递的参数requestCode、resultCode来识别数据来源
public class MainActivity extends AppCompatActivity {
Button btn1;
TextView text;
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1 && resultCode == 2){
String name = data.getStringExtra("name");
int age = data.getIntExtra("age", 0);
text.setText(name + ":" + age);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = findViewById(R.id.text);
findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 启动SecondActivity,并且希望其回传数据
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivityForResult(intent,1);
}
});
}
}
// 回传数据----将数据传回MainActivity
Intent intent = new Intent();
intent.putExtra("name", "王小明");
intent.putExtra("age", 12);
setResult(2, intent);
finish();
4.6 使用Fragment(碎片)
4.6.1 Fragment简介
Fragment是一种嵌入在Activity中的UI片段,它可以用来描述Activity中的一部分布局。
一个Activity可以包含多个Fragment,一个Fragment也可以在多个Activity中使用。
4.6.2 Fragment的生命周期
当在Activity中创建Fragment时,Fragment处于启动状态,
当Activity被暂停时,其中的所有Fragment也被暂停,
当Activity被销毁时,其中的所有Fragment也被销毁,
当一个Activity处于运行状态时,可以单独地对每一个Fragment进行操作:添加时Fragment处于启动状态,删除时Fragment处于销毁状态。
Fragment生命周期相比Activity额外方法:
- onAttach():Fragment和Activity建立关联时调用
- onCreateView():Fragment创建视图(加载布局)时创建
- onActivityCreate():Fragment相关联的Activity已经创建时调用
- onDestroyView(): Fragment关联的视图被移除时调用
- onDetach(): Fragment和Activity解除关联时调用
4.6.3 创建Fragment
创建Fragment时必须创建一个类继承自Fragement。
public class NewListFragment extends Fragment{
@Override
public View on CreareView(LayoutInflater, inflater, ViewGroup container, Bundle savedInstanceState){
View v = inflater.inflate(R.layout.fragment,container, false);
return v;
}
}
4.6.4 在Activity中添加Fragment
Fragment创建完成后并不能单独使用,还需要将Fragment添加到Activity中。
- 在布局文件中添加Fragment
需要在Activity引用的布局文件中使用标签,必须指定android:name属性,属性值为Fragment的全路径名称。 - 在Activity中动态加载Fragment
- 创建一个Fragment实例
- 获取FragmentManager的实例
- 开启FragmentTransaction
- 向Activity的布局容器中添加Fragment
- 通过commit()提交事务
<fragment
android:name="cn.itcast.NewsListFragment"
android:id="@+id/newslist"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
public class MainActivity extends Activity{
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(saveInstanceState);
setContentView(R.layout.activity_main);
NewsListFragment fragment = new NewsListFragment();
FragmentManage fm = getFragementManager();
FragmentTransaction beginTransaction = fm.beginTransaction();
beginTransaction.replace(R.id.ll,fragment);
beginTransaction.commit();
}
}
“getFragmentManager和android.app.Fragment在API 28中已弃用。
现在,我们应该分别使用支持库中的Fragment和getSupportFragmentManager。
但是,如果您担心这些弃用,则还应注意,API 28也弃用了PreferenceFragments。
相反,您应该使用PreferenceFragmentCompat”
应将getFragementManager替换为getSupportFragmentManager()