Activity创建三部曲
-
新建类继承他Activity或者其他子类
-
在Manifest里面声明
-
创建layout并在Activity的onCreate中设置
//Manifest里编写activity的属性:
//如果向改变每个界面的共有属性在application里面加
<activity
android:name=".TextViewActivity"
android:label="文本框界面"
android:theme="@style/Theme.AppCompat.DayNight.NoActionBar" //设置主体,有没有悬浮框
android:screenOrientation="portrait" //设置屏幕固定竖直显示,如果默认就会根据姿势改变
android:launchMode="singleInstance" //设置启动模式(后面会讲区别)
android:exported="false">
//设置这个属性,确定默认启动界面
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="android.app.lib_name"
android:value="" />
</activity>
Activity的生命周期:
创建、开始、重新开始——暂停、停止、摧毁
onCreate(显示布局文件)、onResume(每次进入界面数据刷新)、onPause(离开界面时,自动暂停正在执行的工作)、onDestory(在界面摧毁之前,保存数据)
其中onPause的作用类似中断,比如:当我们使用app时,突然需要接电话,那么activity执行了onPause,返回时执行了onResume;当我们按下返回主界面,activity实际上执行了onPause和onStop。
Activity的跳转和数据传递:
-
显式跳转和隐式跳转
显式跳转需要指明“始发地”和“目的地”,不需要在Manifest.xml文件中添加配置;
隐式跳转不指明我们具体要跳转到的activity,而是需要在new Intent()中填写参数,该参数对应你要隐式跳转到的activity的<intent-filter>标签下action属性的值,两者需要保持一致,同时还必须添加category属性。
//显式跳转(当前.this,目标.class)
intent = new Intent(MainActivity.this, TextViewActivity.class);
stratActivity(intent);
//显式2,一下仅作了解即可
Intent intent = new Intent();
intent.setClass(AActivity.this,BActivity.class);
startActivity(intent);
//显式3
Intent intent = new Intent();
intent.setClassName(AActivity.this,"com.skypan.helloworld.jump.BActivity");
startActivity(intent);
//隐式跳转,首先在Activity文件里面设置intent,intent.setAction()
Intent intent = new Intent();
intent.setAction("com.skypan.test.BActivity");
startActivity(intent);
//要求在Manifest文件里设置,注意跟action字符串和set action一致
//注意MainActivity区分:
<activity
android:name=".jump.BActivity"
android:label="B">
<intent-filter>
<action android:name="com.skypan.test.BActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
-
Avtivity之间的数据传递
A发送
intent.putExtra(String name名称,类型) Intent intent = new Intent(AActivity.this, BActivity.class); Bundle bundle = new Bundle(); bundle.putString("name", "张三"); bundle.putInt("number", 198); intent.putExtras(bundle); startActivity(intent);
B接收
private TextView mTvTitle; private Button mBtnFinish,mBtnJump; Bundle bundle = getIntent().getExtras(); String name = bundle.getString("name"); int number = bundle.getInt("number"); mTvTitle.setText(name+","+number);
-
startActivityForResult:启动Activity,结束后返回结果
第一步A界面通过startActivityForResult(Intent intent, int requestCode)向跳转界面发送,请求码区分事件
第二步B界面通过点击事件里打包数据+ setResult(Activity.RESULT_OK,intent);返回结果
第三步A界面在onActivityResult方法接收传回来的信息
mBtnJump.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //显式1 Intent intent = new Intent(AActivity.this, BActivity.class); Bundle bundle = new Bundle(); bundle.putString("name", "张三"); bundle.putInt("number", 198); intent.putExtras(bundle); startActivityForResult(intent, 0); } @Override //请求码,返回码 protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Toast.makeText(AActivity.this, data.getExtras().getString("title"), Toast.LENGTH_LONG).show(); }
public class BActivity extends AppCompatActivity { private TextView mTvTitle; private Button mBtnFinish,mBtnJump; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_b); Log.d("BActivity","----onNewIntent----"); Log.d("BActivity","taskid:"+getTaskId()+" ,hash:"+hashCode()); logtaskName(); mTvTitle = (TextView) findViewById(R.id.tv_title); mBtnFinish = (Button) findViewById(R.id.btn_finish); mBtnJump = (Button) findViewById(R.id.btn_2); mBtnJump.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(BActivity.this,AActivity.class); startActivity(intent); } }); Bundle bundle = getIntent().getExtras(); String name = bundle.getString("name"); int number = bundle.getInt("number"); mTvTitle.setText(name+","+number); mBtnFinish.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); Bundle bundle1 = new Bundle(); bundle1.putString("title","我回来了"); intent.putExtras(bundle1); setResult(Activity.RESULT_OK,intent); finish(); } }); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); Log.d("BActivity","----onNewIntent----"); Log.d("BActivity","taskid:"+getTaskId()+" ,hash:"+hashCode()); logtaskName(); } private void logtaskName(){ try { ActivityInfo info = getPackageManager().getActivityInfo(getComponentName(), PackageManager.GET_META_DATA); Log.d("BActivity",info.taskAffinity); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } } }
Activity的4种启动模式
Activity是由任务栈管理的,每启动一个Activity,就会被放入栈中,按返回键,就会从栈顶移除一个Activity,
-
standard是默认的启动模式,每次启动一个Activity,就会创建一个新的实例。(taskid一样,任务栈一样,hash值不一样)
-
singleTop当要启动的目标Activity已经位于栈顶,不会创建新的实例,会复用栈顶的Activity,并且其onNewIntent()方法会被调用;如果目标Activity不在栈顶,则跟standard一样创建新的实例。
-
singleTask在同一个任务栈中,如果要启动的目标Activity已经在栈中,则会复用该Activity,并调用onNewIntent()方法,并且该Activity上面的Activity会被清除;如果栈中没有,则创建新的实例。
-
singleInstance:每一个Activity都会占用一个栈,不管是哪个Task,只要存在目标Activity,就复用。