Android:活动的的基本用法

Log用法:logt定义静态常量activity;loge快捷键直接开搞
Toast的基本用法:Toast.makeText(MainActivity.this,"Add",Toast.LENGTH_SHORT).show();
Menu用法:右键res文件创建Directory文件(menu),menu下创建xml文件

<item android:title="Add"
    android:id="@+id/add_item"/>

接着在activity里重写onOptionsItemSelected、nCreateOptionsMenu方法

    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.add_item:
                Toast.makeText(MainActivity.this,"Add",Toast.LENGTH_SHORT).show();
                break;
            case R.id.remove_item:
                Toast.makeText(MainActivity.this,"Remove",Toast.LENGTH_SHORT).show();
                break;
                default:
        }
        return true;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main,menu);
        return true;
    }

Intent实现活动穿梭

显式Intent:设置OnClick点击事件:

edit_back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(EditActivity.this,MainActivity.class);
                startActivity(intent);
            }
        });
    }

隐式Intent
打开网页:

Intent intent =new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);

拨打电话:

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

向下一个活动传递数据:
Activity1:

String data = "hello world!";
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
intent.putExtra("extra_data",data);
startActivity(intent);

Activity2:

Intent intent =getIntent();
String data = intent.getStringExtra("extra_data");
Log.d("SecondActivity",data);

返回数据给上一个活动:
Activity1:

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

重写onActivityResult方法,三个参数分别是,请求码(就是上面的1),第二个是处理结果,第三个是返回数据的Intent

protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        switch (requestCode){
            case 1:
                if (resultCode == RESULT_OK){
                    String returnData = data.getStringExtra("data_return");
                    Log.d("MainActivity",returnData);
                }
                break;
                default:
        }
    }

Activity2:
setResult作用是专门想上一个活动返回数据;finish直接销毁活动。

Button button = findViewById(R.id.button2);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("data_return","Hello World!");
                setResult(RESULT_OK,intent);
                finish();
            }
        });

如果直接想在Activity2里用back键操作的话,则在Activity2里重写onBackPressed方法就好了,直接代替button点击事件。

活动生命周期

android用栈管理活动,当用户点击back键或者调用finish()函数时,活动被销毁。
活动状态:

  1. 运行状态:当活动处于栈顶时,活动为运行状态,系统非常不愿洗回收它来扩充内存。
  2. 暂停状态:活动不再处于栈顶位置但依然可见,如对话框形式的活动,称之为暂停状态,系统也非常不愿意回收这样的活动。
  3. 停止状态:当活动变得既不可见,又被从栈顶移除时,就成了停止状态,系统很容易回首这样的活动,如hupu的后台运行。
  4. 销毁状态:当活动从返回栈移除后就成了销毁状态,系统非常愿意回收这样的活动,直接从后台移除程序。

活动的生存期:7个回调方法覆盖了活动生命周期的每一个环节。

  1. onCreate():在活动第一次被创建时调用时需要重写此方法,完成初始化操作,比如加载布局,绑定事件。
  2. onStart():在活动由不可见变为可见时调用。
  3. onResume():在活动准备好与用户交互时调用,此事活动一定处于运行状态(栈顶)。
  4. onPause():在系统准备启动或者恢复另一个活动时调用,但速度要快(???),不然影响新的栈顶活动。
  5. onStop():在活动变为完全不可见时调用,与onPause()的区别在于,如果启动的活动更是对话框的活动,则onPause()会被调用,而onStop()不会。
  6. onDestroy():在活动被销毁前调用,之后活动变为销毁状态。
  7. onRestart():活动由停止状态变为运行状态时调用,也就是活动被重新启动了。

活动的生存期:除了onRestart()之外的六个活动是两两相对的,分成三个生存期:

  1. 完整生存期:活动在onCreate()和onDestroy()之间所经历就是完整生存期。onCreate()中进行各种初始化工作,onDestroy()中完成释放内存的操作。
  2. 可见生存期:onStart()和onStop()之间所经历的的,就是可见生存期,在此时期内,活动对于用户总是可见的(即使无法交互),我们可以在onStart()中加载资源,在onStop()释放资源,从而保证停止的活动不会占用太多内存。
  3. 前台生存期:onResume()和onPause()之间就是前台生存期,在此期间内,活动总处于运行状态,活动能和用户交互,一般来说我们接触到最多的也是此期间内的活动。
    在这里插入图片描述
    onSaveInstanceState()在onPause()或onStop()之前执行:可以解决返回主活动时数据丢失的情况。
    MainActivity里重写onSaveInstanceState方法:
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        String tempData = "hello world!";
        outState.putString("data_key",tempData);
    }

MainActivity里的onCreate( savedInstanceState)调用

 if (savedInstanceState != null){
            String tempData = savedInstanceState.getString("data_key");
        }

活动的启动方式:

活动的启动方式可以在AndroidManifest.xml中的< activity>标签中指定android:launchMode属性(< intent-filter>标签外边)

standard:

活动默认的启动f方式,在此模式下,每当启动一个新的活动,就会在返回栈中入栈,且处于栈顶,而且系统不在乎你返回栈中是否有这个活动,每次启动都会创建该活动的一个新的实例。如图,返回栈中有三个Activity实例:
在这里插入图片描述

singleTop:

在此模式下,如果启动活动时发现返回栈的栈顶已经是该活动,则认为可以直接使用他,不会在创建新的活动实例。如果活动不是处于栈顶位置,则启动活动时还是会创建新的活动实例了,如图所示:
在这里插入图片描述

singleTask:

在此模式下,每次启动该活动时系统都会在返回栈中检查是否存在该活动,如果存在就直接使用该活动实例,还会把此活动之上的活动统统出栈,使此活动处于栈顶位置(先onRestart新活动,再把他前面(栈里)的出栈);如果没有发现就会创造一个新的实例:
在这里插入图片描述

singleInstance:

这个启动模式是4个里面最复杂的一个:他会启动一个新的返回栈来管理此活动。试用情景,允许其他程序调用此程序中的活动,而在此模式下系统会创建一个公共的返回栈,不管那个应用程序访问此活动,都会公用这个新建的返回栈,如图所示:
在这里插入图片描述

活动的最佳实践

知晓当前是哪一个活动:

创建一个新的普通的Java类,名为BaseActivity,让他继承AppCompatActivity:

public class BaseActivity extends AppCompatActivity {
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.d("BaseActivity", getClass().getSimpleName());
    }
}

让他变成所有活动的父类,就让所有活动继承它就完了,他又继承AppCompatActivity,所以项目中互动的功能完全不受印象,点击运行,打开哪个活动看日志就可以了。

随时随地退出程序:

首先建一个ActivityCollector类(普通的Java类)作为活动管理器,建一个List来暂存活动,创建addActivity方法来添加活动,创建removeActivity来从List中移除活动,最后创建一个finishAll()方法来销毁List当中的所有活动:

public class ActivityCollector {
    public static List<Activity>activities = new ArrayList<>();
    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();
    }
}

修改BaseActivity中代码:

public class BaseActivity extends AppCompatActivity {
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.d("BaseActivity", getClass().getSimpleName());
        ActivityCollector.addActivity(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        ActivityCollector.removeActivity(this);
    }
}

onCreate()中调用ActivityCollector()的addActivity()方法,重写onDestroy()方法调用ActivityCollector()的RemoveActivity()方法,将一个马上要销毁的活动在活动管理器中移除出去。
如果你想在任何地方退出程序,直接调用ActivityCollector中的finishAll()方法就可以了,设置一个button点击事件,ActivityCollector.finishAll()。
杀掉进程代码:略。

启动活动的最佳写法:

添加一个actionStart()方法:
传入要传入的参数,这里假设是两个字符串参数data1,data2。

    public  static void actionStart(Context context,String data1,String data2){
        Intent intent = new Intent(context,SecondActivity.class);
        intent.putExtra("param1",data1);
        intent.putExtra("param2",data2);
        context.startActivity(intent);
    }

所有SecondActivity中的参数都是通过actionStart()方法体现出来了,这样就能一目了然SecondActivity所需要的所有参数,只许要一行代码(button点击事件)就可以启动SecondActivity:

SecondActivity.actionStart(FirstActivity.this,"data1","data2");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值