Android Studio开发学习(十二)——Activity

一、前提

Activity是开发中必有也是最重要的一部分

二、目标

1、AndroidMainifest中一些属性

2、Activity的生命周期

3、Activity的跳转以及数据传递

4、四种启动模式

三、内容

1、AndroidMainifest中一些属性

以下属性都可以添加到activity中

​​​​​​​android:label="text" <!--设置标题-->
android:theme="@style/Theme.AppCompat.NoActionBar" 没有标题
android:screenOrientation="portrait" 竖屏显示 ;landscape 横屏显示
android:launchMode="" 启动模式
<intent-filter></intent-filter>默认的启动Activity

 

2、Activity的生命周期

期间会经历的阶段有

onCreate():创建一个Activity

onStart():将onStart()分派给所有片段。确保所有创建的加载器都是现在开始。

onResume():将onResume()分派到片段。注意,为了更好的互操作,对于较旧版本的平台,此时调用附属于活动的片段是,而不是恢复。这意味着在某些情况下,仍然可以保存以前的状态,这是不允许的

onPause():就是暂停,将onPause()分派给片段。

onStop():停止

onRestart():重启

onDestory():毁坏

当我们运行一个Activity时会先启动onCreate(),onStart(),onResume(),退出后会启动onPause(),onStop(),onDestory()

 

3、Activity的跳转以及数据传递

首先在activity_main文件中添加一个按钮

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.sunny.activity.MainActivity">

    <Button
        android:id="@+id/btn1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="text"/>
</RelativeLayout>

在MainActivity中添加

package com.example.sunny.activity;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    private Button button1,button2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button1= (Button) findViewById(R.id.btn1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, AActivity.class);
                startActivity(intent);
            }
        });
    }
}

其实点击事件中的代码就是跳转事件

另外再创建两个java文件,相互跳转使用,我创建了一个AActivity.java和BActivity.java,再第一个布局文件中添加一个按钮,再第二个布局文件中添加一个按钮一个文本框

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.sunny.activity.AActivity">

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="text"
        />
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="com.example.sunny.activity.BActivity">

    <TextView
        android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:textColor="#000000"
        />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

(1)显式跳转

在AActivity.java中添加

package com.example.sunny.activity;

import android.content.ComponentName;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class AActivity extends AppCompatActivity {
    private Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_a);

        button= (Button) findViewById(R.id.btn);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //显式跳转1
                Intent intent=new Intent(AActivity.this,BActivity.class);
                startActivity(intent);
}
                //显式跳转2
                Intent intent=new Intent();
                intent.setClass(AActivity.this,BActivity.class);
                startActivity(intent);
 
                //显式跳转3
                Intent intent=new Intent();
                intent.setClassName(AActivity.this,"com.example.sunny.activity.BActivity");
                startActivity(intent);

                //显式跳转4
                Intent intent=new Intent();
                intent.setComponent(new ComponentName(AActivity.this,"com.example.sunny.activity.BActivity"));
                startActivity(intent);

显式跳转有四种表达方式,最常用的是第一种,第三种和第四种中的其中一个参数是你的文件所在的包名

这样你点击按钮后便会跳转到B文件

(2)隐式跳转

                //隐式跳转
                Intent intent=new Intent();
                intent.setAction("com.test.BActivity");
                startActivity(intent);

注意在使用隐式跳转时要在AndroidMainifest中的B活动下添加,其中的action android:name=""中可以随便写,category中的意思是不要将其视作开机时的首要文件

<activity android:name=".BActivity" android:label="B">
            <intent-filter>
                <action android:name="com.test.BActivity" />

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

(3)数据传递

将自己所用的数据传至下一个活动,代码如下

                Intent intent=new Intent(AActivity.this,BActivity.class);
                Bundle bundle=new Bundle();
                bundle.putString("name","mengqi");
                bundle.putInt("int",90);
                intent.putExtras(bundle);
                startActivity(intent);

因为我们要通过putExtras()方法进行传值,摁住Ctrl键点击putExtras()后进入其方法内可以看到,它其实就是new Bundle(),通过bundle的方法进行传值,所有可以之间创建一个Bundle,Bundle表示从字符串值到各种可打包类型的映射,传入数据后再传给intent。

在BActivity.java中添加,表示接收数据

package com.example.sunny.activity;

import android.app.Activity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class BActivity extends AppCompatActivity {
    private TextView textView;
    private Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_b);
        textView= (TextView) findViewById(R.id.tv1);
        button= (Button) findViewById(R.id.button);
        final Bundle bundle=getIntent().getExtras();
        String name=bundle.getString("name");
        int number=bundle.getInt("int");

        textView.setText(name+","+number);
    }
}

效果图在最后

(4)启动Activity,结束后返回结果

意思就是当b活动接收到信息后返回给A活动一个信息,只需将startActivity(intent)变为下一行的代码即可,因为在app开发中,不可能只有一个活动会传回消息,添加一个请求码就可以知道是哪一个发出的请求

startActivityForResult(intent,0);//请求码,根据请求码可以判断是哪一步跳转过去的

在BActivity.java中添加一个点击事件,表示将信息传回

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                Bundle bundle1=new Bundle();
                bundle.putString("title","i am back");
                intent.putExtras(bundle);
                setResult(Activity.RESULT_OK, intent);//判断是否成功
                finish();
            }
        });

最后在AActivity中添加,表示自己接受回调的信息,意思是将传入的结果分派到正确的片段。

@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_SHORT).show();
    }

4、启动模式

Activity是由任务栈管理的,没启动一个Activity,就会被放入栈中,按返回键,就会从栈顶移除一个Activity

Activity的android:launchMode属性

standard:标准模式,默认,每启动一个Activity,都会创建一个新的实例

singleTop:Task栈顶复用模式(先进后出,后进先出),当要启动的Activity已经位于栈顶时,不会创建新的实例,会复用栈顶的Activity,并且其onNewIntent()方法会被调用;如果目标Activity不在栈顶,则跟standard一样创建新的实例

singleTask:Task栈内复用模式,在同一个任务栈中,如果要启动的目标Activity已经在栈中,则会复用该Activity,并调用其onnewIntent()方法,并且该Activity上面的Activity会被清除,如果栈中没有,则创建新的实例

singleInstance:全局单例模式,全局复用,不管那个Task栈,只要存在目标Activity,就复用。每个Activity占有一个新的Task栈,使用较少

四、总结

Activity很重要内容也较多,当然还会继续补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值