Activity使用

Activity创建三部曲

  1. 新建类继承他Activity或者其他子类

  2. 在Manifest里面声明

  3. 创建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,就复用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值