Android入门——Activity分析及使用

学习code:MainActivity

https://github.com/liuyan2010/android_learn.git

主要内容
Activity生命周期
Intent使用:

  • Activity跳转
  • 传递参数/对象
  • Activity反向传递数据
  • Activity再次启动时,之前数据不丢失

Activity四种启动模式(存储栈方式分析)
app监控Activity操作

Activity生命周期

Activity生命周期

Activity 类定义了下面的回调:
回调 描述

  • onCreate() 这是第一个回调,在活动第一次创建时调用
  • onStart() 这个回调在活动为用户可见时被调用
  • onResume() 这个回调在应用程序与用户开始可交互的时候调用
  • onPause() 被暂停的活动无法接受用户输入,不能执行任何代码。当前活动将要被暂停,上一个活动将要被恢复时调用
  • onStop() 当活动不在可见时调用
  • onDestroy() 当活动被系统销毁之前调用
  • onRestart() 当活动被停止以后重新打开时调用

App demo示例:

package com.example.activity_test;

import androidx.appcompat.app.AppCompatActivity;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.content.ServiceConnection;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    String msg = "TEST:";
    private Button bt1;
    @Override
    /** 当活动第一次被创建时调用 */
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(msg, "The onCreate() event");

        bt1 = findViewById(R.id.button001);
        bt1.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setData(Uri.parse("https://www.baidu.com"));
                startActivity(intent);
            }
        });
    }

    /** 当活动即将可见时调用 */
    @Override
    protected void onStart() {
        super.onStart();
        Log.d(msg, "The onStart() event");
    }

    /** 当活动可见时调用 */
    @Override
    protected void onResume() {
        super.onResume();
        Log.d(msg, "The onResume() event");
    }

    /** 当其他活动获得焦点时调用 */
    @Override
    protected void onPause() {
        super.onPause();
        Log.d(msg, "The onPause() event");
    }

    /** 当活动不再可见时调用 */
    @Override
    protected void onStop() {
        super.onStop();
        Log.d(msg, "The onStop() event");
    }

    /** 当活动将被销毁时调用 */
    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(msg, "The onDestroy() event");
    }
}

执行结果:
打开app

  1. onCreate()
  2. onStart()
  3. onResume()

将app放到后台/或者界面跳转

  1. onPause()
  2. The onStop()

将app退出

  1. onPause()
  2. onStop()
  3. onDestroy()

销毁一个Activity——finish()
Toast使用

Toast.makeText(getApplicationContext(), "You are OK",Toast.LENGTH_SHORT).show();

Intent使用,数据传递保存

跳转操作
显式Intent:对于明确指出了目标组件名称的Intent,我们称之为显式Intent

Intent intent = new Intent(MainActivity.this, Main2Activity.class);
startActivity(intent);

隐式Intent:对于没有明确指出目标组件名称的Intent,则称之为隐式Intent
Android系统寻找与Intent请求意图最匹配的组件具体的选择方法 是:Android将Intent的请求内容和一个叫做IntentFilter的过滤器比较,IntentFilter中包含系统中所有可能的待选组件。如果IntentFilter中某一组件匹配隐式Intent请求的内容,那么Android就选择该组件作为该隐式Intent的目标组件。
AndroidManifest.xml
action配置:包名+项目名+自定义名
category配置:默认写成android.intent.category.DEFAULT即可

<intent-filter>
    <action android:name="com.example.activity_test.ACTION_START001" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

MainActivity.java

Intent intent = new Intent();
intent.setAction("com.example.activity_test.ACTION_START001");
startActivity(intent);

Intent传递参数
一般的传递操作:
MainActivity.java

double PI = 3.1415926;
intent.putExtra("PI", PI);		//可传各种类型参数

Main2Activity.java

double PI = getIntent().getExtras().getDouble("PI");

使用Bundle传递多个参数
MainActivity.java

Bundle bundle = new Bundle();
bundle.putDouble("PI", 3.1415926);
intent.putExtras(bundle);

接收方式不变,不需要修改

传递对象操作(将对象序列化,传递后恢复)

Bundle bundle = new Bundle();
bundle.putSerializable("user", user);	//	key,value
intent.putExtras(bundle);

注意:user类需要实现serialable接口

接收对象:

user=(User)intent.getSerializableExtra("user");

数据反向传递
一个Activity可能包含多个按钮,每个按钮跳转至不同的Activity处理不同的业务,这些跳转后的Activity关闭后又要返回跳转前的Activity并返回数据怎么办?
使用方法:

startActivityForResult(Intent intent, int requestCode)

接收方法:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    //使用requestCode判定是哪一个Activity返回,接收数据,执行相关操作
}

数据保存不丢失
保存Activity的信息:例如在Activity1输入一些信息,跳转到Activity2,如果Activity1被回收了,再次返回时,Activity1信息需要重新输入,比较麻烦。
重写方法onSaveInstanceState:

protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
//outState是一个bandle,存储数据即可
}

在OnCreate里直接将数据拿出来即可:

if(savedInstanceState != null){
	savedInstanceState.getString(“key”);	//获取数据
}

Activity的四种启动模式

Android使用返回栈来管理Activity

android:launchMode="singleTop"	//修改xml即可

standard:每次创建新的Activity到栈顶。
singleTop:创建之前检查栈顶Activity是否为需要的Activity,如果是直接使用,否则创建
singleTask:创建之前从栈里面寻找Activity,如果存在直接将该Activity之前的全部出栈,使用该Activity,否则创建新的。
singleInstance:特殊情况使用,供其他app调用。创建一个新的返回栈,可以供多个程序调用

app程序全局维护监测

程序app维护监测,确认当前在哪一个Activity执行:
写一个Base类,让其他的Activity都去继承这个Base类即可:

public class BaseActivity extends AppCompatActivity {

    String Tag = "BaseActivity";
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(Tag, getClass().getSimpleName());	//打印标签和Activity名

    }
}

随时随地的退出程序

创建一个单例类,可以对所有的Activity进行finish操作

public class ActivityControler {
    private static ArrayList<Activity> activities;
    public static void addActivity(Activity activity){
        activities.add(activity);
    }

    public static void removeActivity(Activity activity){
        activities.remove(activity);
    }

    public static void finishAll(){
        for (Activity activity : activities){
            if (!activity.isFinishing())
                activity.finish();
        }
        activities.clear();
    }
}

在每个Activity里面执行:ActivityControler.addActivity(this); //存储Activity

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值