《第一行代码--android》笔记·第二章:活动

目录

 

2.2活动

2.2.1手动创建活动

2.2.3创建和加载布局

2.2.4在活动中使用toast

2.2.5在活动中使用Menu

2.2.6销毁活动

2.3使用Intent

2.3.1显示Intent

2.3.2隐式Intent

2.3.3更多的隐式intent用法

2.2.4向下一个活动传递数据

2.3.5返回数据给上一个活动

2.4活动的生命周期

2.4.1返回栈

2.4.2活动状态

2.4.5保存临时数据

2.5活动的启动方式


2.2活动

活动是一种包含用户界面的组件,主要用于与用户交互。

必须在AndroidManifest.xml中注册。

<activity android:name=".FirstActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<action android:name="android.intent.action.MAIN" />和<category android:name="android.intent.category.LAUNCHER" />:标识该活动为主活动。

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

所有的活动必须继承Activity或者其子类。

onCreate():活动创建时必须执行的方法。

setContentView():给当前活动引入布局。

2.2.1手动创建活动

app/src/main/java/com.example.activitytest中新建Activity,名字为 Empty Activity

(Generate Layout File表示自创建一个布局文件;Launcher Activity将该活动设置为当前项目主活动,Compatibility为项目启动向下兼容模式)

2.2.3创建和加载布局

android讲究逻辑与视图分离,最好每个活动对应一个布局文件,布局用来显示界面内容

app/src/main/res中创建Directory,名为layout;layout中创建Layout resource file,根元素选择LinearLayout

(XML中:引用一个id,使用@id/id_name;定义一个id,使用@+id/id_name)

项目中所有的资源都会在R文件中生成一个相应资源的id

在AndroidManifest中注册

所有活动都要在在AndroidManifest中注册才能生效。

活动的注册要放在<application>标签内

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".FirstActivity"
            android:label="This is FirstActivity">
            <intent-filter>//声明为主活动
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

没有主活动的项目可以安装,但无法打开。一般作为第三方服务供其他应用在内部调用。

2.2.4在活动中使用toast

用作显示提示信息

protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);
        Button button1 = (Button) findViewById(R.id.button_1);//获取在布局文件中定义的元素,返回View对象
        button1.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){
                Toast.makeText(FirstActivity.this, "You clicked Button 1", Toast.LENGTH_SHORT).show();//(Contest,“文本内容”,显示时长)
                finish();
            }
        });
    }

findViewById():获取在布局文件中定义的元素。返回View对象,一般需要向下转型。

makeText(Context,"message",显示时长):

Context:Toast要求的上下文,Activity本身也是Context对象。

message:提示的信息。

显示时长:Toast.LENGTH_SHORT和Toast.LENGTH_LONG。

2.2.5在活动中使用Menu

res下新建Directory,名为menu。menu下新建Menu resource file,名为main。

main.xml中

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item//创建菜单项
        android:id="@+id/add_item"//唯一标识符
        android:title="Add"/>//菜单项名称
    <item
        android:id="@+id/remove_item"
        android:title="Remove"/>

</menu>

活动中:

public boolean onCreateOptionsMenu(Menu menu) {//创建菜单
        getMenuInflater().inflate(R.menu.main,menu);
        return true;
    }

    
public boolean onOptionsItemSelected(MenuItem item) {//菜单响应事件
        switch (item.getItemId()){
            case R.id.add_item:
                Toast.makeText(this, "You clicked Add", Toast.LENGTH_SHORT).show();
                break;
            case R.id.remove_item:
                Toast.makeText(this, "You clicked Remove", Toast.LENGTH_SHORT).show();
                break;
            default:
        }
        return true;
    }

getMenuInflater():返回当前Activity下的MenuInflater对象。

inflate(R.menu.main,Menu):创建菜单,第一个参数:指定用哪一个资源来创建菜单;第二个参数:指定创建的菜单项添加到哪一个Menu对象中。

getItemId():返回点击的菜单项的ID。

return true:显示菜单。

2.2.6销毁活动

finish()

2.3使用Intent

Intent:用于Android程序中各个组件之间的交互。一般可以用于启动活动,启动服务,发送广播等

2.3.1显示Intent

            public void onClick(View v){
                Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
                startActivity(intent);
            }
        

Intent(Context packageContext,Class<?>cls)//(启动活动的上下文,想要启动的目标活动)

2.3.2隐式Intent

<intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
 </intent-filter>
public void onClick(View v){
    Intent intent = new Intent(“com.example.activitytest.ACTION_START”);
    intent.addCategory("com.example.activitytest.MY_CATEGORY");
    startActivity(intent);
}

每个intent只能指定一个action,但是可以有多个category

只有<action>和<category>中的内容同时匹配Intent指定的内容,该活动才能相应这个Intent。

2.3.3更多的隐式intent用法

打开网页

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

Intent.ACTION_VIEW:常用的内置常量,对于要跳转的内容进行最合适的处理。

Uri.parse(String):将String解析为Uri对象;

setData(Uri):设置Intent处理的数据,自动清除Intent里原来的数据。

同时在<intent-filter>中配置<data>标签,用于精确指定当前活动能相应什么类型数据

<data>标签可配置一下内容:

android:scheme;//用于指定数据协议部分,如http。

android:host;//用于指定数据的主机名部分,如www.baidu.com

android:port;//用于指定数据方端口部分,一般紧随在主机名之后

android:path;//用于指定主机名和端口之后的部分,如一段网址中跟在域名后面的部分

android:mimeType;//用于指定可以处理的数据类型,允许使用统配符的方式进行指定

<intent-filter>
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:scheme="http" />
</intent-filter>

除了http协议外,还有geo表示地理位置和tel表示拨打电话

intent.setData(Uri.parse("tel:10086"));

2.2.4向下一个活动传递数据

String data = "Hello the second";
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("extra_data",data);//(key,data)
startActivity(intent);


Intent intent = getIntent();//捕获启动SecondActivity的Intent
String data = intent.getStringExtra("extra_data");
Log.d("SecondActivity",data);

2.3.5返回数据给上一个活动

public void onClick(View view){
    Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
    startActivityForResult(intent,1);
}


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

startActivityForResult(Intent,RequestCode):子活动销毁时能够返回一个结果给父活动。Intent,父活动;RequestCode:大于0时,子活动销毁时会返回给onActivityResult()。

onActivityResult(int requestCode, int resultCode, Intent data):得到子活动返回的数据。requestCode,启动时传入的请求码;resultCode,子活动传输的处理结果;Intent,带有数据的Intent;

子活动

                Intent intent = new Intent();
                intent.putExtra("data_return","Hello FirstActivity");
                setResult(RESULT_OK,intent);
                finish();

setResult(RESULT_OK,intent):向父活动返回数据,第一个参数RESULT_OK/RESULT_CANCELED;第二个参数,带有数据的Intent。

2.4活动的生命周期

2.4.1返回栈

Android使用任务(Task)管理活动,一个任务就是一组存放在栈里活动集合(返回栈Back Stack)。

2.4.2活动状态

1.运行状态:活动处于返回栈栈顶

2.暂停状态:活动不处于返回栈栈顶,但仍然可见

3.停止状态:活动不处于返回栈栈顶,并且不可见

4.销毁状态:活动从返回栈中移除

2.4.3活动的生存期

onCreate():活动第一次被创建时使用,完成初始化操作。

onStart():活动由不可见变为可见时使用。

onResume():活动准备好与用户交互时使用,此时活动位于返回栈栈顶,处于运行状态。

onPause():在系统准备去启动或恢复另一个活动的时候调用。执行速度一定要快。

onStop():活动完全不可见时使用。与onPause()的区别:如果是对话框式活动,onPause()会执行。

onDestroy():活动被销毁之前调用。

onRestart():活动在停止状态变为运行状态之前调用。

完整生存期:onCreate()--onDestroy()

可见生存期:onStart()--onStop(),活动对用户可见。

前台生存期:onResume()--onPause(),活动可以和用户交互。

2.4.5保存临时数据

onSaveInstanceState(Bundle):在活动被回收前调用,Bundle有一系列保存数据的方法。

protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        String tempData = "Something you just type";
        outState.putString("data_key",tempData);//(键,值)
    }
public static final String TAG = "MainActivity";
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG,"onCreate");
        setContentView(R.layout.activity_main);

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

2.5活动的启动方式

AndroidManifest.xml中改变活动属性:<activity android:launchMode="">

standard:系统不在乎该活动返回栈中是否存在,每次启动时创建新的实例。

singleTop:启动活动时,如果该活动在返回栈栈顶,则直接使用。

singleTask:每次启动活动时,检查返回栈中是否存在该活动的实例,如果存在,则直接使用,并且该活动之上的所有实例均出栈。

singleIestance:启动一个新的返回栈管理该活动,便于共享活动。

猜你喜欢

转载自blog.csdn.net/fingers_xwk/article/details/81180726