Activity是什么?
Activity 是用户接口程序,几乎所有的 Activity 都要和用户打交道。
每个 Activity 都提供一个用户界面窗口,一般情况下,该界面窗口会填满整个屏幕,但是也可以比屏幕小,或者浮在其他的窗口之上。
Activity的四种状态,运行状态,暂停状态,停止状态,销毁状态。
Activity的生命周期
名称 | 调用时间 |
---|---|
onCreate(Bundle savedInstanceState) | 创建 Activity 时调用。 设置在该方法中,还以 Bundle 的形式提供对以前储存的任何状态的访问。其中参数 savedInstanceState 对象是用于保存 Activity 的对象的状态。 |
onStart() | Activity 变为在屏幕上对用户可见时调用。 |
onResume() | Activity 开始与用户交互时调用(无论是启动还是重启一个活动,该方法总是被调用)。 |
onPause() | 当 Android 系统要激活其他 Activity 时,该方法被调用,暂停或收回 CPU 和其他资源时调用。 |
onStop() | Activity 被停止并转为不可见阶段时调用。 |
onRestart() | 重新启动已经停止的 Activity 时调用。 |
onDestroy() | Activity 被完全从系统内存中移除时调用。 该方法被调用可能是因为有人直接调用 finish() 方法或者系统决定停止该活动以释放资源。 |
activity的创建,启动,关闭
1、创建
① 创建继承自Activity的Activity
② 重写需要回调的方法
③ 设置要显示的视图
但这些还不够,我们还要在AndroidManifest.xml文件中对建立的 Activity 进行注册,即在 <application> 标签下添加 <activity> 标签。
对于主 Activity(即入口Activity),还要为其添加 <intent-filter> 标签。(intent是很重要的概念,Activity通过Intent来表达自己的意图)
2、启动
Activity分为入口Activity和其他Activity,他们的启动方式是不同的。
对于入口Activity,只需在AndroidManifest.xml中配置即可。
对于其他Activity,可以添加按钮点击事件,进行跳转,跳转代码如下。
intent = new Intent(MainActivity.this, DemorActivity.class); startActivity(intent);
3、关闭
在单击事件中添加 finish()方法即可。
对于其他Activity,关闭后返回上一个Activity,若是入口Activity,则会退出程序,返回主屏幕。
平常我们用到刷新功能,可用如下代码完成。
onCreat(null);
多个Activity的使用
Activity 数据传递共有三种:
- 通过 Intent 传递一些简单的数据。
- 通过 Bundle 传递相对复杂的数据或者对象。
- 通过 startActivityForResult 可以更方便地进行来回传递,当然前两种方法也可以来回传递。
通过bundle在两个Activity传递数据。
package com.example.project_1; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btn = findViewById(R.id.btn); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //取值 String site1 = ((EditText)findViewById(R.id.et_site1)).getText().toString(); String site2 = ((EditText)findViewById(R.id.et_site2)).getText().toString(); String site3 = ((EditText)findViewById(R.id.et_site3)).getText().toString(); String name = ((EditText)findViewById(R.id.et_name)).getText().toString(); String phone = ((EditText)findViewById(R.id.et_phone)).getText().toString(); if(!"".equals(site1)&&!"".equals(site2)&&!"".equals(site3)&&!"".equals(name)&&!"".equals(phone)){ Intent intent = new Intent(MainActivity.this,AddressActivity.class); //创建Bundle对象,保存输入的信息 Bundle bundle = new Bundle(); bundle.putCharSequence("name",name); bundle.putCharSequence("phone",phone); bundle.putCharSequence("site1",site1); bundle.putCharSequence("site2",site2); bundle.putCharSequence("site3",site3); intent.putExtras(bundle); startActivity(intent);//传递到AddressActivity中 }else{ Toast.makeText(MainActivity.this,"请将收货地址填写完整",Toast.LENGTH_SHORT).show(); } } }); } }
package com.example.project_1; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.widget.TextView; public class AddressActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_address); //接收传来的bundle值 Intent intent = getIntent(); Bundle bundle = intent.getExtras(); String name = bundle.getString("name"); String phone = bundle.getString("phone"); String site = bundle.getString("site1")+bundle.getString("site2")+bundle.getString("site3"); TextView tv_name = findViewById(R.id.name); TextView tv_phone = findViewById(R.id.phone); TextView tv_site = findViewById(R.id.address); //输出在xml文件中 tv_name.setText("姓名:"+name); tv_phone.setText("电话:"+phone); tv_site.setText("地址:"+site); } }
调用另一个Activity并返回结果
实例:选择头像功能。
(在当前Activity点击选择头像按钮,跳转到头像列表Activity,选好后退出该Activity,并将选择结果呈现在主Activity)
package com.example.project_1; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.GridView; import android.widget.ImageView; public class HeadActivity extends AppCompatActivity { //头像资源 private int[] imageId = new int[]{R.drawable.img01,R.drawable.img02,R.drawable.img03,R.drawable.img04,R.drawable.img05}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_head); GridView gridView = findViewById(R.id.grideview); BaseAdapter adapter = new BaseAdapter() {//重写监听器方法 @Override public int getCount() { return imageId.length; } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ImageView imageView; if(convertView==null){ imageView = new ImageView(HeadActivity.this); imageView.setAdjustViewBounds(true); imageView.setMaxHeight(150); imageView.setMaxWidth(158); imageView.setPadding(5,5,5,5); }else{ imageView = (ImageView)convertView; } imageView.setImageResource(imageId[position]); return imageView; } }; gridView.setAdapter(adapter); //选项被点击的监听器 gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent = getIntent(); Bundle bundle = new Bundle(); bundle.putInt("imageId",imageId[position]); intent.putExtras(bundle); setResult(0x11,intent); finish(); } }); } }
接下来引入Fragment
Fragment介绍
Fragment是Android3.0后引入的一个新的API,他出现的初衷是为了适应大屏幕的平板电脑, 当然现在他仍然是平板APP UI设计的宠儿,而且我们普通手机开发也会加入这个Fragment, 我们可以把他看成一个小型的Activity,又称Activity片段!想想,如果一个很大的界面,我们 就一个布局,写起界面来会有多麻烦,而且如果组件多的话是管理起来也很麻烦!而使用Fragment 我们可以把屏幕划分成几块,然后进行分组,进行一个模块化的管理!从而可以更加方便的在 运行过程中动态地更新Activity的用户界面!另外Fragment并不能单独使用,他需要嵌套在Activity 中使用,尽管他拥有自己的生命周期,但是还是会受到宿主Activity的生命周期的影响,比如Activity 被destory销毁了,他也会跟着销毁!
Fragment生命周期:
在Activity中添加Fragment
1、直接在布局文件中添加,用<Fragment></Fragment>组件完成。
2、当Activity运行时添加。