Android:4大基础组件之Activity

49 阅读5分钟

image.png

不负时间馈赠努力,活成自己喜欢的样子; 不要急,你和那些好东西总有一天会相遇。

Activity

Activity是Android应用程序的四大组件之一,它负责管理Android应用程序的用户界面。

例:

  • onKeyDow(int keyCode,KeyEcent event):对应按键按下事件
  • onKeyUp(int keyCode,KeyEcent event):对应按键松开事件
  • onTouchEvent(KeyEcent event):对应点击屏幕事件

onKeyDown()监听手机屏幕上的按键,应用场景通常是我们要退出一个软件时。

private long clickTime = 0L;//除始时间

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
//            当第二次点击时间范围不(>2000)那么就退出该程序
            if (System.currentTimeMillis() - clickTime > 2000) {
                Toast.makeText(this, "在按一次退出!", Toast.LENGTH_SHORT).show();
                clickTime = System.currentTimeMillis();//将第一次点击的时间赋给它
            } else {
                finish();
            }
            return true;

        }
        return super.onKeyDown(keyCode, event);
    }

tutieshi_360x684_8s.gif

响应屏幕触摸事件

//    触摸事件点击和松开都会响应
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float x = event.getX();//获取屏幕的x轴坐标
        float y = event.getY();//获取屏幕的y轴坐标
//        Log.d(TAG, "点击时改坐标处于屏幕的:" + x + ":" + y);
        Toast.makeText(MainActivity.this, "点击时改坐标处于屏幕的:("+x+" : "+y+")", Toast.LENGTH_SHORT).show();
        return super.onTouchEvent(event);
    }

tutieshi_360x684_10s.gif

响应按键松开事件

  @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        Toast.makeText(MainActivity.this, "按钮弹起", Toast.LENGTH_SHORT).show();
//        Log.d(TAG, "按钮弹起: ");
        return super.onKeyUp(keyCode, event);
    }

image.png

Activity生命周期

生命周期就是一个对象从创建到销毁的过程,每个对象都有自己的生命周期。同样Activity也具有生命周期,Activity生命周期分为三种状态,分别是运行状态,暂停状态,和停止状态。

  1. 运行状态
当activity在屏幕的最前端时,它是可见的、有焦点的可以用来处理用户的常见操作如:点击、双击、长按等。
  1. 暂停状态
在某些情况下,Activity对于用户来说仍可见的,但它不再在拥有焦点,即无法和用户实现交互行为。最常见的例子就是全屏弹窗广告。当最上面的Activity是半透明或者没有完全覆盖屏幕,被覆盖的Activity仍然可见,并且存活。

3.停止状态

当Activity完全不可见时,它就处于停止状态,但仍然保留当前的状态和成员信息。然而这些对于用户来说是不可见的,当如果系统内存不足时,这个不可见的Activity很容易被杀死。

1678245586891.jpg

Activity的启动模式
  • standard模式

    • 是Activity的默认启动模式,在不指定的情况下,所有的Activity都默认为standard启动模式。
    • 处于该模式下的Activity每次启动都是一个新的Activity,它就会进入任务栈并且处于栈顶的位置,它不会判断栈中是否存在该Activity每次都会创建一个新的实例
  • singleTop模式

    • 该模式和standard模式很相似,但是如果在该模式下Activity处于栈顶的位置,那么它不会重写创建而是直接使用,如果不处于栈顶,则创建一个新的实例位于栈顶。
  • singleTask模式

    • 如果希望Activity中只存在一个实例,可以使用该模式当Activity启动模式指定为singleTask,每次启动该Activity中,都会先检查栈中是否存在该实例,存在则使用,并将Activity之上的所有Activity出栈,如果没有则创建。
  • singlelnstance模式

    • 在程序开发中,如果需要Activity在整个系统中都只有一个实例,这时就需要用到该模式。不同于上面3种模式,使用该模式的Activity会启动一个新的任务栈来管理这个Activity。

想具体了解请点击该处移步官网权威解说

Intent在Activity中的作用

翻译为意图,Intent最常见的用途是绑定应用程序组件,并在应用程序之间进行通信。一般用于启动Activity、启动服务、发送广播等,承担了Android应用程序Activity、Service、BroadcastReceiver三大核心组件相互的通信功能。

Intent又分为显式意图和隐式意图。

显式意图:通过Intent启动Activity时,需要明确指点激活组件的名称。在程序中,如果需要在Activity启动另一个Activity时可以使用显式意图来启动。

//      参数1:该Activity;参数2:需要跳转的Activity文件名
Intent intent=new Intent(this,MainActivity2.class);
startActivity(intent);

隐式意图:没有明确指定组件名的Intent为隐式意图。Android会根据隐式意图中设置的动作(action),类别(category),数据(Uri和数据类型)找到合适的组件。

<activity
    android:name=".MainActivity2"
    android:exported="true" >
    <intent-filter>
        <action android:name="cn.itscast.guo" />

        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

隐式跳转:

Intent intent=new Intent();
intent.setAction("cn.itscast.guo");
startActivity(intent);

相比于显式,隐式的功能更加强大,显式跳转必须指点跳转的文件名,而隐式不仅可以跳转Activity,还可以打开其他的应用组件,比如照相机,浏览器等都可以通过隐式跳转来打开

//        跳转网路设置界面
Intent intent =  new Intent(Settings.ACTION_AIRPLANE_MODE_SETTINGS);
startActivity(intent);

Activity中的数据传递

Activity传值

        Intent intent=new Intent(this,MainActivity2.class);
//        通过键值对的方式传值。
        intent.putExtra("text",textView.getText().toString());
        startActivity(intent);

Activity接收

//        获取Activity传值意图
        Intent intent=getIntent();
//        看传过来的是什么数据类型,如果是字符串就用getStringExtra接收,如果是整形就用getIntExtra接收
        String n=intent.getStringExtra("text");

第二个Activity回传数据

String it="我是回传的数据";
Intent intent1=new Intent();
intent1.putExtra("eq",it);
setResult(1,intent1);

第一个Activity接收数据

Intent intent=new Intent(this,MainActivity2.class);
startActivityForResult(intent,1);

//    接收数据的结果
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (data!=null){
            if (resultCode==1){
                if (requestCode==1){
                    String s= (String) data.getSerializableExtra("eq");
                    textView.setText(s);

                }
            }
        }
    }

走正确的路,放无心的手,结有道之朋,断无义之友,饮清净之茶,戒色花之酒,开方便之门,闭是非之口。