一:Activity是什么?
Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务。
Activity中所有操作都与用户密切相关,是一个负责与用户交互的组件,可以通过setContentView(View)来显示指定控件。
在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。
二:如何创建一个Activity
第一步: 创建一个类继承AppCompatActivity
public class MainActivity extends AppCompatActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); } }
第二步: 在Andmainifest中申明这个类
<activity android:name=".MainActivity" android:label="appname"> </activity>
第三步: 如果这个类是主入口需要申明intent-filter
<activity android:name=".MainActivity" android:label="123"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
三:Activity和Layout以及view之间的关联
public class MainActivity extends AppCompatActivity{//实现了点击事件接口 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //activity与layout进行关联 setContentView(R.layout.activity_login); //通过findViewById将layout中的控件找出来转成view final TextView textView = findViewById(R.id.titleTextview); //拿到button这个view Button button = findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { //为textview设置文本 textView.setText(getString(R.string.app_name)); } }); } }
四:Activity之间的跳转
public void loginClick(View view){ //通过Intent意图对象,传递参数从当前activity跳转到目标activity Intent intent = new Intent(this,IndexActivity.class); //逻辑处理 startActivity(intent); }
五:Activity启动模式
四种启动模式
standard:系统默认的启动模式,栈结构,打开一个activity入栈,再打开下个activity,接着入栈,先进后出的特点,我们平时直接创建的Activity都是这种模式的Activity,这种模式的Activity的特点是:只要你创建了Activity实例,一旦激活该Activity,则会向任务栈中加入新创建的实例,退出Activity则会在任务栈中销毁该实例。
singleTop:如果某个Activity自己激活自己,即任务栈栈顶就是该Activity,则不需要创建,其余情况都要创建Activity实例;
singleTask:如果要激活的那个Activity在任务栈中存在该实例,则不需要创建,只需要把此Activity放入栈顶,并把该Activity以上的Activity实例都pop;
singleInstance:如果我们将某个activity设置成这个singleStance启动模式,则当激活这个activity之后单独放到一个栈,下次再使用的时候,直接使用这个栈,比如打电话应用就是一个singleStance模式启动的activity
代码实现有两种方式
第一种在mainifest.xml中配置,想要的启动模式
<activity android:name=".IndexActivity" android:launchMode="singleInstance"/>
第二种在java代码中设置
Intent intent = new Intent(this,IndexActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); //逻辑处理 startActivity(intent);
六:Activity声明周期
onCreate():当我们点击activity的时候,系统会调用activity的oncreate()方法,在这个方法中我们会初始化当前布局setContentLayout()方法。
onStart():onCreate()方法完成后,此时activity进入onStart()方法,当前activity是用户可见状态,但没有焦点,与用户不能交互,一般可在当前方法做一些动画的初始化操作。
onResume():onStart()方法完成之后,此时activity进入onResume()方法中,当前activity状态属于运行状态 (Running),可与用户进行交互。
onPause():当另外一个activity覆盖当前的acitivty时,此时当前activity会进入到onPause()方法中,当前activity是可见的,但不能与用户交互状态。
onStop():onPause()方法完成之后,此时activity进入onStop()方法,此时activity对用户是不可见的,在系统内存紧张的情况下,有可能会被系统进行回收。所以一般在当前方法可做资源回收。
onDestroy():onStop()方法完成之后,此时activity进入到onDestory()方法中,结束当前activity。
onRestart():onRestart()方法在用户按下home()之后,再次进入到当前activity的时候调用。调用顺序onPouse()->onStop()->onRestart()->onStart()->onResume().
七:Activity之间的数据传输
当我们在一个Activity打开另一个Activity的时候,如何把当前这个Activity的一些数据带到即将打开的Activiry,再次关闭打开的Activity时候,如何把数据带到当前这个Activity?
Activity之间是通过Intent进行通信的。intent.putExtra()这个方法参数有多种可以满足数据传输需求
如下代码是第一个Activity
public class MainActivity extends AppCompatActivity{//实现了点击事件接口 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); } public void loginClick(View view){ Intent intent = new Intent(this,IndexActivity.class); //第一种方法是传输基本类型数据 intent.putExtra("name","www.javayihao.top"); //第二种方法是传输一个bundle,bundle类似一个map,可以防止key-value类型数据 Bundle bundle = new Bundle(); bundle.putString("name","www.javayihao.top"); intent.putExtra("bundle",bundle); //第三种方法传输一个序列化,这里User是implements Serializable之后才能传递 intent.putExtra("name",new User()); startActivity(intent); } }
第二个activity
public class IndexActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if(getIntent()!=null) { //第一种接收方法 String name= getIntent().getStringExtra("title"); //第二种接收方法 String name1 = getIntent().getBundleExtra("bundle").getString("name"); } } }
如何让第一个activity接收第二个activity关闭之后传递的数据
第一步,在第一个activity加入以下代码
Intent intent = new Intent(this,IndexActivity.class); startActivityForResult(intent,100);
第二步,在第二个activity设置
public void loginClick(View view){ Intent intent = new Intent(); intent.putExtra("name","www.javayihao.top"); setResult(RESULT_OK,intent); // setResult(RESULT_OK); finish(); }
第三步,在第一个activity中的onActivityResult添加方法
@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode==100&&resultCode==RESULT_OK){ //其他业务 } }