Android学习笔记-第一章 Activity

第一章 Activity

一、创建Activity

1.创建.java文件

在这里插入图片描述

2.继承系统Activity

package com.example.myactivity;

import android.app.Activity;

public class MyActivity extends Activity {
}

3.在AndroidManifest中注册

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myactivity">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MyActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>
</manifest>

xml打入方法
1.
在这里插入图片描述在这里插入图片描述
2.
在这里插入图片描述

4.设置布局资源文件

在这里插入图片描述

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="Hello"/>
</LinearLayout>
package com.example.myactivity;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;

public class MyActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activitymy);
    }
}

二、AndroidManife

mark
mark
mark
mark
按住ctrl,点击绿色,可以打开资源文件,在里面设置

三、Activity启动

Activity的启动方法

  • 显式启动:
    明确指定要启动的Activity的class或者 包名.activitiy类名

  • 隐式启动:
    设置启动过滤器,通过指定的action或action和data属性,系统会查找符合条件的activity,并启动它

显式启动:

方式一:class跳转

Intent intent = new Intent(Activity1.this, Activity2.class);
             startActivity(intent);

方式二:包名.类名跳转

Intent intent = new Intent(); om.maizi.lesson.activitylesson
             intent.setClassName(context, “c1”);
             startActivity(intent);

方式三:ComponentName跳转

Intent intent = new Intent();
             intent.setComponent(new Component(context, Activity2.class))
             startActivity(intent);

MyActivity.java

package com.example.myactivity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class MyActivity extends Activity {
    Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activitymy);
        button=findViewById(R.id.Button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                intent.setClass(MyActivity.this,SecondActivity.class);
                startActivity(intent);
            }
        });
    }
}

mark
activity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Hello"/>
    <Button
        android:id="@+id/Button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="打开第二个界面"/>

</LinearLayout>

SecondActivity.java

package com.example.myactivity;

import android.app.Activity;
import android.os.Bundle;

public class SecondActivity extends Activity {
    @Override
    protected void onCreate( Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
    }
}

activity_second.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="第二个界面"/>

</LinearLayout>

AndroidManife.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myactivity">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MyActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>


        <activity android:name=".SecondActivity">
        </activity>
    </application>
</manifest>

创建Activity不要忘记注册它

不要忘记startActivity(intent)

隐式启动

  • 方式一:构造时传入actionName
    Intent intent = new Intent(“com.maizi.lesson.SecondActivity”);
    startActivity(intent);

  • 方式二:构造完成后设置actionName
    Intent intent = new Intent();
    intent.setAction(“com.maizi.lesson.SecondActivity”);
    startActivity(intent);

注意:如果自己定义的某个Activity要通过隐式启动,在AndroidManifast.xml那么必须加上android.intent.category.DEFAULT,否则不起作用

在AndroidManife中添加

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

MyActivity.java中修改

public void onClick(View v) {
    //第一种方法
    Intent intent=new Intent("abc.SecondActivity");
    startActivity(intent);
    //第二种方法
    Intent intent=new Intent();
    intent.setAction("abc.SecondActivity");
    startActivity(intent);
}

关闭Activity

在SecondActivity中创建button,并创建监听,其中关闭代码如下

public void onClick(View v) {
                SecondActivity.this.finish();
}

四、配置Action、Category

Action :

      它代表系统中已经定义的一系列常用的动作
      属性的值是一个字符串
      通过setAction()方法或在清单文件AndroidManifest.xml中设置

当有多个Action匹配隐式启动的条件时,将会弹出选择框

AndroidManifest.xml中将两个action的name设置成相同的,其中label为Activity设置名字

        <activity android:name=".ThirdActivity" android:label="第三个Activity">
            <intent-filter>
                <action android:name="abc.SecondActivity"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
        
        
        <activity android:name=".SecondActivity" android:label="第二个Activity">
            <intent-filter>
                <action android:name="abc.SecondActivity" />

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

当点击第一个Activity启动时,多个Action匹配隐式启动的条件,就会就会让用户选择哪个启动

Intent intent=new Intent();
intent.setAction("abc.SecondActivity");
startActivity(intent);

mark

Category

指定当前动作(Action)被执行的环境

通过addCategory()方法或在清单文件AndroidManifest.xml中设置

常用值 :

android.intent.category.LAUNCHER

设置该组件为在当前应用程序启动器,通常和入口ACTION_MAIN配合使用。

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

当有多个MAIN和LAUNCHER时手机桌面一个应用会显示多个程序
mark

android.intent.category.DEFAULT

Android系统中默认的执行方式,按照普通Activity的执行方式执行。

注意事项

  • 需要隐式启动的Activity必须标记category为android.intent.category.DEFAULT

如果不写会导致,程序异常退出,报错
mark

  • android.intent.category.LAUNCHER标记的Activity将会作为app的启动器显示在手机桌面图标上,通常和Action.Main一起使用

五、Activity的生命周期

当个Activity启动生命周期

mark
mark
mark
mark

多个Activity的生命周期

mark

实验记录

MyActivity: MyActivity_onCreate
MyActivity: MyActivity_onStart
MyActivity: MyActivity_onResume

点击按钮

MyActivity: MyActivity_onPause
SecondActivity: MyActivity_onCreate
SecondActivity: MyActivity_onStart
SecondActivity: MyActivity_onResume
MyActivity: MyActivity_onStop

返回

SecondActivity: MyActivity_onPause
MyActivity: MyActivity_onStart
MyActivity: MyActivity_onResume
SecondActivity: MyActivity_onStop
SecondActivity: MyActivity_onDestroy

退出程序

MyActivity: MyActivity_onPause
MyActivity: MyActivity_onStop
MyActivity: MyActivity_onDestroy

六、Activity的启动模式-launchMode

启动模式概念

决定生成新的Activity实例是否重用已存在的Activity实例,是否和其他Activity实例公用一个task里。

Task概念

task是一个具有栈结构的对象,一个task可以管理多个Activity,启动一个应用,也就建一个与之对应的task

配置方法

在manifest文件中Activity节点里增加属性android:launchMode=“standard”

四种启动模式

  1. standard

    默认的启动模式,每次激活Activity时(startActivity),都创建Activity实例,并放入任务栈

  2. singleTop

    如果某个Activity自己激活自己,即任务栈栈顶就是该Activity,则不需要创建,其余情况都要创建Activity实例
    mark

    SecondActivity 栈顶
    ThirdActivity
    SecondActivity
    MianActivity 栈底

  3. singleTask

    如果要激活的那个Activity在任务栈中存在该实例,则不需要创建,把该Activity以上的Activity实例都出栈,他就成为栈顶;
    mark

    ThirdActivity 栈顶
    SecondActivity
    MianActivity 栈底
    再次启动SecondActiviy,会销毁ThirdActivity,变成如下
    SecondActivity 栈顶
    MianActivity 栈底

  4. singleInstance

    只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别 的Activity存在

    MainActivity的TaskID50
    SecondSActivity的TaskID51 //新的ID
    ThirdActivity的TaskID50 //任然用旧的ID

实现记录

在MainActivity启动ThirdActivity,再启动ThirdActivity,再启动SecondActivity,由于当在singleTop启动模式下,栈顶是第三个Activity,会创建一个新的SecondActivity。
内存中Activity的排列如下

AndroidManife.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.launchmodal">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".ThirdActivity"></activity>
        <activity
            android:name=".SecondActivity"
            android:launchMode="singleTop" />
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

MainActivity.java

package com.example.launchmodal;

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 {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
          Button button=findViewById(R.id.button_start);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(MainActivity.this,SecondActivity.class);
                startActivity(intent);
            }
        });

    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!">

    </TextView>

    <Button
        android:id="@+id/button_start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="启动" />
</LinearLayout>

SecondActivity.java

package com.example.launchmodal;

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

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        Button button=findViewById(R.id.button_second);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(SecondActivity.this,ThirdActivity.class);
                startActivity(intent);
            }
        });
    }
}

activity_second.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="第二个Activity">

    </TextView>
    <Button
        android:id="@+id/button_second"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="启动第三个Activity"/>

</LinearLayout>

ThirdActivity.java

package com.example.launchmodal;

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

public class ThirdActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_third);
        Button button=findViewById(R.id.button_third);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(ThirdActivity.this,SecondActivity.class);
                startActivity(intent);
            }
        });
    }
}

activity_third.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="第三个Activity">

    </TextView>
    <Button
        android:id="@+id/button_third"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="启动第二个Activity"/>

</LinearLayout>

七、Activity的启动模式-IntentFlag

  • Task概念

    • task是一个具有栈结构的容器,可以放置多个Activity实例
    • 启动一个应用,系统就会为之创建一个task,来放置根Activity
    • 一个Activity启动另一个Activity时,两个Activity是放置在同一个task中的,后者压入前者所在的task栈,当用户按下后退键,后者从task被弹出,前者又显示在幕前
  • Android:taskAffinity

    • 指出了它希望进入的Task
    • 如果一个Activity没有显式的指明该Activity的taskAffinity,那么它的这个属性就等于Application指明的taskAffinity
    • 如果 Application也没有指明,那么该taskAffinity的值就等于包名
    • Task也有自己的affinity属性,它的值等于它的根 Activity的taskAffinity的值

IntentFlag的常用值

1.FLAG_ACTIVITY_NEW_TASK

系统会寻找或创建一个新的task来放置目标Activity,寻找时依据目标Activity的taskAffinity属性进行匹配,如果找到一个task的taskAffinity与之相同,就将目标Activity压入此task中,

如果一个Activity没有显式的指明该Activity的taskAffinity,那么它的这个属性就等于Application指明的taskAffinity,如果Application也没有指明,那么该taskAffinity的值就等于包名,所以实验不设置SecondActivity的taskAffinity会导致,启动第二个Activity时,两个Activity的TaskID相同

如果查找无果,则创建一个新的task,并将该task的taskAffinity设置为目标Activity的taskAfiinity,将目标Activity放置于此task

2.FLAG_ACTIVITY_SINGLE_TOP
和singleTop类似

当task中存在目标Activity实例并且位于栈的顶端时,不再创建一个新的,直接利用这个实例

3.FLAG_ACTIVITY_CLEAR_TOP
和singleTask类似

如果要激活的那个Activity在任务栈中存在该实例,则不需要创建,只需要把此Activity放入栈顶,并把该Activity以上的Activity实例都出栈;

4.FLAG_ACTIVITY_REORDER_TO_FRONT

如果栈里已经存在,则将它拿到栈顶,不会启动新Activity

栈顶

ThirdActivity

SecondActivity

MainActivity

栈底

在第三个Activity中以REORDER_TO_FRONT方式启动第二个Activity

栈顶

SecondActivity

ThirdActivity

MainActivity

栈底

实验记录

AndriodManefest.xml

        <activity android:name=".SecondActivity"
            android:taskAffinity="flg.newtask.test"></activity>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

MainActivity.java

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

启动时

当前TaskID53

启动第二个Activity

当前TaskID54

如果不在AndriodManefest设置SecondActivity的taskAffinity属性,两者ID将相同

八、Activity之间的数据传递

  1. 第一种

Intent. putExtra(String name, 数据类型 value)

  1. 第二种

mark

复杂类型的数据传递

1、Serilziable
把需要传递的类实现Serilziable接口

2、Parceable
把需要传递的类实现Parceable接口

实验记录

MainActivity.java

package com.example.bundle;

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 {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button=findViewById(R.id.button_start);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(MainActivity.this,SecondActivity.class);
//1.直接通过Intent传
//              intent.putExtra("new_title","安卓开发行情");
//              intent.putExtra("comment",1244);

//2.Bundle打包一起通过Intent传
//                Bundle bundle=new Bundle();
//                bundle.putString("new_title","安卓开发行情");
//                bundle.putInt("comment",1244);
//                intent.putExtra("myBundle",bundle);


//1.用Serilziable方法传递对象
//                UserInfo userInfo=new UserInfo();
//                userInfo.userName="maizi";
//                userInfo.age=24;
//                userInfo.gender=1;
//                intent.putExtra("userInfo",userInfo);

///2.用Parceable方法传递对象
                Order order=new Order();
                order.address="阳光路";
                order.count=3;
                order.isReceived=false;
                intent.putExtra("order",order);



                startActivity(intent);
            }
        });
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!">

    </TextView>

    <Button
        android:id="@+id/button_start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="启动并传递" />
</LinearLayout>

SecondActivity.java

package com.example.bundle;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        TextView paramsTextView=findViewById(R.id.tv_params);
        TextView comment=findViewById(R.id.comment_count);

//1.直接通过Intent传
//        String title=getIntent().getStringExtra("new_title");
//        int count=getIntent().getIntExtra("comment",0);

//2.Bundle打包一起通过Intent传
//        Bundle bundle=getIntent().getBundleExtra("myBundle");
//        String title=bundle.getString("new_title");
//        int count=bundle.getInt("comment");
//1和2的输出语句
//        paramsTextView.setText(title);
//        comment.setText(count+"");//y因为setText有一个重载函数,int的sourceID,将int转化成String,不加""会报错


        //1.用Serilziable方法传递对象
//        UserInfo userInfo= (UserInfo) getIntent().getSerializableExtra("userInfo");
//        paramsTextView.setText(userInfo.userName+","+userInfo.age+","+userInfo.gender);

        ///2.用Parceable方法传递对象
        Order order=getIntent().getParcelableExtra("order");
        paramsTextView.setText(order.address+","+order.count+","+order.isReceived);


    }
}

activity_second.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="传入的数据是">

    </TextView>
    <TextView
        android:id="@+id/tv_params"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

    </TextView>

    <TextView
        android:id="@+id/comment_count"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

    </TextView>

</LinearLayout>

mark
mark

九、Activity数据回传

  1. 使用startActivityForResult启动。

  2. 在SecondActivity返回时会回掉 MainActivity中的onActivityResult,要重写里面的方法,进行操作

实验记录

本实验各xml配置和上一题相同

MainActivity.java

package com.example.bundle;

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

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button=findViewById(R.id.button_start);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(MainActivity.this,SecondActivity.class);
                startActivityForResult(intent,100);//100是自己定义的,用于区分
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        String back_data=data.getStringExtra("back_data");
        Log.e("MainActivity","onActivityResult的requestCode="+requestCode+back_data);
    }
}

SecondActivity.java

package com.example.bundle;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        TextView paramsTextView=findViewById(R.id.tv_params);
        TextView comment=findViewById(R.id.comment_count);
        Intent intent=new Intent();
        intent.putExtra("back_data","回传的数据");
        setResult(RESULT_OK,intent); 
    }
}

mark

十、调用系统的Activity

MainActivity.java

package com.example.bundle2;

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

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button=findViewById(R.id.button_start);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
//1.打开拨号界面
                //intent.setAction(Intent.ACTION_DIAL);
//2.发送短信
//                Uri smsToUrl= Uri.parse("smsto:"+"10086");
//                intent.setAction(Intent.ACTION_SENDTO);
//                intent.setData(smsToUrl);
//                intent.putExtra("sms_body","发送的内容");
//3.打开相机
                intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);

                startActivity(intent);
            }
        });
    }
}

AndroidManifest.xml(添加如下权限)

<uses-permission android:name="android.permission.CALL_PHONE"/>
    <uses-permission android:name="android.permission.SEND_SMS"/>

十一、intentFIlter中的data和type

Data匹配时的规则一共有四条:

  1. 如果Intent没有指定Data相关的字段,只能匹配上没有指定Data的IntentFilter
  2. 如果一个Intent只指定了Uri但是没有Type(并且Type也不能够从Uri中分析出)只能匹配到仅指定了相应Scheme且没有指定Type的IntentFilter
  3. 如果一个Intent只指定了Type,但是没有指定Uri,它只能匹配到只指定了相应Type且没有指定Scheme的IntentFitler
  4. 如果一个Intent即有Uri又有Type,那么它会匹配上:
    1. Uri和Type都匹配的IntentFilter;
    2. 首先Type要匹配,另外如果Intent的Uri是content:或file:,且IntentFilter没有指定Scheme。(因为对于Android来讲content和file这二种Scheme是系统最常见 也是用的最多的,所以就当成缺省值来对待)

MainActivity.java

package com.example.bundle2;

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

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button=findViewById(R.id.button_start);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                intent.setAction("test.secondActivity");
                //1.android:scheme="test" 
//                intent.setData(Uri.parse("test://www.baidu.com"));
                //2.android:scheme="test" android:mimeType="text/plain"
                intent.setDataAndType(Uri.parse("test://www.baidu.com"),"text/plain");
                startActivity(intent);
            }
        });
    }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.bundle2">

    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.SEND_SMS" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".SecondActivity">
            <intent-filter>
                <action android:name="test.secondActivity"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:scheme="test" android:mimeType="text/plain"/>
            </intent-filter>
        </activity>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值