Android 四大组件之Activity

一、Activity介绍

1、先介绍一下什么是组件

(1)组件的对象是由系统创建,而且一般都是继承特定接口或父类。

(2)组件需要在配置文件配置全类名。

(3)组件的对象具有一定的生命周期, 它的类中有对应的生命周期回调方法 

2、Activity是什么?

Activity提供界面和用户交互,当然,和系统相关的打电话,短信,拍照等也要用到Activity。

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

 

二、、Intent

Intent经常和Activity配合使用,Activity的startActivity(Intent intent)。

1、Intent分为显示Intent与隐式Intent:

(1)显示Intent

显示Intent可以实现在不同的Activity之间进行跳转,指明了从哪个Activity跳转到哪里Activity。而且跳转的时候还可以带上一些额外的数据,到达另一个Activity可以把额外的数据获取。

例1:从MainActivity跳转到HomeActivity

public class MainActivity extends Activity {
    private Button btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获得按钮对象
        btn=findViewById(R.id.but_1);
        //给按钮注册点击事件
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //创建Intent对象
                Intent intent=new Intent(MainActivity.this,HomeActivity.class);
                //额外数据
                intent.putExtra("id",1);
                //启动指定的HomeActivity
                startActivity(intent);
            }
        });
    }
}
public class HomeActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        Intent intent=getIntent();
        //获取MainActivity设置的额外数据
        int id=intent.getIntExtra("id",0);
        Toast.makeText(this,id+"",Toast.LENGTH_LONG).show();
    }
}

例2:从MainActivity跳转到HomeActivity,把HomeActivity的数据带回到MainActivity。

public class MainActivity extends Activity {
    private Button btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获得按钮对象
        btn=findViewById(R.id.but_1);
        //给按钮注册点击事件
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //创建Intent对象
                Intent intent=new Intent(MainActivity.this,HomeActivity.class);
                //注意这里不一样拉
                startActivityForResult(intent,1);
            }
        });
    }

  
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode){
            case 1:
                if(resultCode==RESULT_OK){
                    String name=data.getStringExtra("name");
                    Toast.makeText(this,name+"",Toast.LENGTH_LONG).show();
                }
                break;
        }
    }
}
public class HomeActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        Intent intent=getIntent();
        //获取MainActivity设置的额外数据
        intent.putExtra("name","haitao");
        setResult(RESULT_OK,intent);
        finish();//关闭当前的Activity
    }
}

2、隐式Intent

隐式Intent就是不直接告诉要启动哪个活动,而是制定了配置来决定。

说白了就是一个活动根据Intent设置的action和category的值,系统到功能清单文件中去找匹配的action和category的值,有匹配的就启动找到的活动。

例1:隐式方式启动HomeActivity

只有同时满足HomeActivity的action和category才能启动HomeActivity。

        <activity android:name=".HomeActivity">
            <intent-filter>
                <action android:name="com.haitao.xxxx.ACTION_START"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="com.haitao.xxxx.categort.LALALALA"/>
            </intent-filter>
        </activity>
public class MainActivity extends Activity {
    private Button btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获得按钮对象
        btn=findViewById(R.id.but_1);
        //给按钮注册点击事件
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //创建Intent对象(隐式)
                Intent intent=new Intent("com.haitao.xxxx.ACTION_START");
                //这个可以不用加上,系统会自动添加,因为使用的是系统默认的。
                intent.addCategory("android.intent.category.DEFAULT");
                //如果功能清单中使用的不是系统默认,那么就要加上
                intent.addCategory("com.haitao.xxxx.categort.LALALALA");
                //也可以带上数据
                intent.putExtra("name","haitao");
               //启动指定的Activity
                startActivity(intent);
            }
        });
    }
}
public class HomeActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        Intent intent=getIntent();
        String name=intent.getStringExtra("name");
        Toast.makeText(this,name+"",Toast.LENGTH_LONG).show();
    }
}

例2:隐式启动浏览器

//创建Intent对象(隐式)
Intent intent=new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);

例3:隐式启动打电话的活动

Intent intent=new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);

三、活动的生命周期

1、返回栈

Android中的活动是可以重叠的,新启动的活动会覆盖到原来活动的上面,销毁上一个活动下一个活动就会显示出来。

2、活动的生命周期

活动的生存周期:

onCreate() :活动第一次创建时候会调用。

onStart(): 活动从不可见到可见时候会调用。

onResume(): 活动准备好了和用户交互时候调用,活动会处于运行状态并且处于栈顶位置。

onPause(): 系统准备启动或恢复一个另一个活动时候调用,这里可以用来把消耗CPU的资源释放了,保存有用的数据。

onStop():完全不能看到的活动会处于停止状态。

onDestory():准备销毁一个活动的时候会调用。

onRestart():活动从停止到运行状态会调用,就是重启一个活动。

活动的四种状态

(1)运行状态:活动处于栈顶的时候

(2)暂停状态:活动不在栈顶但是可见(弹出提示框,对话框下面的活动就会暂停)。

(3)停止状态:活动不在栈顶并且完全不可见,活动就会停止。

(4)销毁状态:活动被移除了。

结论

1)界面从“死亡”-->“运行" 

  创建对象-->onCreate()-->onStart()-->onResume()---可见可操作(运行状态)

2) 界面从“运行”-->“死亡" 

  onPause()-->onStop()-->onDestroy()-->Activity对象成为垃圾对象---不可见也不存在死亡状态)

3) 界面从“运行”-->“停止" 

  onPause()-->onStop()---不可见但存在

4) 界面从“停止” -->“运行"

  onRestart()-->onStart()-->onResume()

5) 界面从“运行”-->“暂停" 

  onPause()

6) 界面从“暂停” -->“运行"

   onResume()

3、解决活动被回收后数据没有了的情况

例如:进入了一个填写表但的活动,然后点了表单的某个按钮到达了另一个活动,当从另一个活动返回来发现原来填写的表但数据没有了,这时表单的活动就是被系统回收了。

public class MainActivity extends Activity {
    private Button btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //当活动再次创建时候读取数据
        if(savedInstanceState!=null){
            savedInstanceState.getString("name");
        }
    }

    //当活动被回收之前会被调用,可以用来保存临时数据
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        //保存数据,假设是从表单获取的数据
        String name="haitao";
        outState.putString("name",name);
    }
}

 

四、Activity的launchMode

1、Activity的launchMode

(1、在Android中, 启动一个Activity有时需要总是创建一个新对象, 有时需要复用已有的对象, 可以通过在配置activity时通过launchMode属性指定

(2 launchMode属性值(4个)为:

standard: 标准模式,每次调用startActivity()方法就会产生一个新的实例。

singleTop: 如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例;如果不位于栈顶,会产生一个新的实例。

singleTask: 只有一个实例, 默认在当前Task中

singleInstance: 只有一个实例, 创建时会新建一个栈, 且此栈中不能有其它对象

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值