Android-Intent详解

Demo下载:

http://download.csdn.net/detail/daiyibo123/9500330


显示Intent启动Activity方式总结:


     显示启动就是在明确指出要启动的Activity或者Service的类或者包名。
     显示Intent调用Activity,有以下5种方式。通过查看内部代码,可以知道其实都是在设置ComponentName对象。通过设置ComponentName对象 来确定应当显示的Activity对象。
     总而言之,显示启动Activity,就是通过不同的方式设置ComponentName对象。

下面是调用Activity的五种方式,及其相关源代码:

Intent  intent new Intent() ;
intent.setClass(MainActivity. this, SystemActivity. class) ;
startActivity( intent) ;

//setClass方法中,设置ComponentName,源代码如下:
public Intent  setClass(Context packageContext Class<?> cls) {
    mComponent =  new ComponentName(packageContext cls) ;
    return this;
}


Intent  intent new  Intent() ;
intent.setClassName(MainActivity. this,  "example.abe.com.intentactivity.SystemActivity") ;
startActivity( intent) ;

//setClassName方法中,设置ComponentName,源代码如下:
public  Intent  setClassName(Context packageContext String className) {
    mComponent =  new ComponentName(packageContext className) ;
    return this;
}


Intent  intent new  Intent() ;
intent.setClassName( "example.abe.com.intentactivity" , "example.abe.com.intentactivity.SystemActivity") ;
startActivity( intent) ;
//setClassName方法中,设置ComponentName,源代码如下:
public  Intent  setClassName(String packageName String className) {
    mComponent =  new ComponentName(packageName className) ;
    return this;
}


Intent  intent new  Intent() ;
ComponentName  comp new ComponentName(MainActivity. this, SystemActivity. class) ;
intent.setComponent( comp) ;
startActivity( intent) ;
//setComponent方法中,设置ComponentName,源代码如下:
public  Intent  setComponent(ComponentName component) {
    mComponent = component ;
    return this;
}


Intent  intent new  Intent(MainActivity. this, SystemActivity. class) ;
startActivity( intent) ;
//Intent 构造方法
public Intent(Context packageContext Class<?> cls) {
    mComponent =  new ComponentName(packageContext cls) ;
}



隐式Intent启动Activity方式总结

     隐式启动是不明确指定启动哪个Activity或者Service,而是通过设置Action、Data、Category,让系统来筛选出合适的目标。
     系统接收到隐式启动请求后,会根据系统中各个Activity在AndroidManifest.xml文件中声明的<intent-filter>来比较和判断是否匹配当前的Intent请求的。

<intent-filter>标签介绍:
<action>,<category>和<data>是<intent-filter>中最常用的三个标签。下面是对他们的简单描述:

<action>
这个标签是必须添加的,可以自己定义,也可以使用系统预定义的变量,Android系统默认定义了很多action,具体可以查看SDK文档。
只要满足一个<action>标签 就可以启动Intent。

<category>
category代表类别,定义了Activity的类别,Activity可以设置一个或者多个category标签。注意,如果使用startActivity( ),默认需要实现 android.intent.category.DEFAULT。
只要Intent中添加的category,在<intent-filter>中都可以匹配到,就可以启动Intent。

<data>
data 代表数据源,是<intent-filter>中最复杂的标签,因为不同的Activity支持的数据来源和类型多种多样,所以需要通过详细的data标签信息来指明。具体参考官方文档。
只要满足一组<data>标签 ,就可以启动Intent(如果设置了mimeType,那么必须使用 intent.setDataAndType(data, "text/*”); 启动activity)

示例:

AndroidMainfest.xml描述
<activity  android :name= ".SuccessfulActivity" >
        <intent-filter>
            <action  android :name= "example.abe.com.intentactivity.successfulActivity"  />
            <category  android :name= "android.intent.category.DEFAULT"  />
            <category  android :name= "example.abe.com.intentactivity.category.successfulActivity" />
            <data  android :scheme= "scheme1Test"  android :host= "host1Test" />
            <data  android :scheme= "scheme2Test"  android :host= "host2Test"  />
            <data  android :mimeType= "text/*" />
        </intent-filter>
</activity>

SuccessfulActivity.java
public class SuccessfulActivity  extends AppCompatActivity {

    @Override
    protected void  onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState) ;
        setContentView(R.layout. activity_successful) ;

        TextView textView = (TextView)findViewById(R.id. main_tv) ;
        if (getIntent().getData() !=  null){
            String scheme = getIntent().getData().getScheme() ; //获取Data中的scheme
            String host = getIntent().getData().getHost() ; //获取Data中的host
            textView.setText( "successful:" + scheme + host) ;
        }
    }
}

布局文件
只有一个TextView(略)

隐式Intent调用代码
Button methodBtn1 = (Button)findViewById(R.id. method1_btn) ;
methodBtn1.setOnClickListener( new View.OnClickListener() {
    @Override
    public void  onClick(View v) {
        Intent intent =  new Intent( "example.abe.com.intentactivity.successfulActivity") ;
        intent.addCategory( "example.abe.com.intentactivity.category.successfulActivity") ; //可加可不加

        intent.setDataAndType(Uri. parse( "scheme1Test://host1Test:") "text/*") ;

        //判断是否存在Activity
        if(intent.resolveActivity(getPackageManager()) !=  null){
            startActivity(intent) ;
        } else{
            Toast. makeText(ImplicitIntentActivity. this,  "没有找到对应的Activity" Toast. LENGTH_SHORT).show() ;
        }
    }
}) ;

参考:
http://ticktick.blog.51cto.com/823160/1621957
http://developer.android.com/intl/zh-cn/guide/components/intents-filters.html#Resolution


隐式Intent调用系统功能:


     调用系统程序其实就是隐式跳转,只不过使用的是系统内置的一些Action,Uri,Data等信息而已。

打电话功能
在AndroidMainfest.xml中添加权限:
<manifest  xmlns: android = "http://schemas.android.com/apk/res/android"
        package= "example.abe.com.intentactivity" >
    //添加打电话权限
    <uses-permission  android :name= "android.permission.CALL_PHONE"  />
</manifest>

Button callBtn = (Button) findViewById(R.id. call_btn) ;
callBtn.setOnClickListener( new View.OnClickListener() {
    @Override
    public void  onClick(View v) {
        //打电话,需要android.permission.CALL_PHONE权限
        PackageManager pm = getPackageManager() ;
        boolean permission = (PackageManager. PERMISSION_GRANTED ==
                pm.checkPermission( "android.permission.CALL_PHONE" "example.abe.com.intentactivity")) ;
        if (permission) {
            Intent intent =  new Intent(Intent. ACTION_CALL Uri. parse( "tel:10086")) ;
            startActivity(intent) ;
       else {
            Toast. makeText(SystemActivity. this,  "没有打电话权限" Toast. LENGTH_SHORT).show() ;
        }
    }
}) ;

发短信功能
不需要权限,因此不要在AndroidMainfest.xml中设置信息
Button messageBtn = (Button) findViewById(R.id. message_btn) ;
messageBtn.setOnClickListener( new View.OnClickListener() {
    @Override
    public void  onClick(View v) {

        Intent intent =  new Intent(Intent. ACTION_SENDTO Uri. parse( "smsto:10086")) ;
        intent.putExtra( "sms_body" "查流量") ;
        startActivity(intent) ;
    }
}) ;
 

Activity之间数据传递

发送数据
intent.putExtra( "name" , "Abe") ;

Bundle bundle =  new Bundle() ;
bundle.putString( "name" , "Abe") ;
intent.putExtras(bundle) ;

接收数据
String name = intent.getStringExtra( "name") ;

Bundle bundle = intent.getExtras() ;
String name = bundle.getString( "name") ;

活动A跳转到活动B 数据传输

Button dataBtn = (Button) findViewById(R.id. data_btn) ;
dataBtn.setOnClickListener( new View.OnClickListener() {
    @Override
    public void  onClick(View v) {
        Intent intent =  new Intent(MainActivity. this, DataActivity. class) ;
        Bundle bundle =  new Bundle() ;
        bundle.putString( "Toast" "收到从MainActivity中传过来的数据") ;
        intent.putExtra( "Bundle" bundle) ;
        startActivity(intent) ;
    }
}) ;

public class DataActivity  extends AppCompatActivity {

    @Override
    protected void  onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState) ;
        setContentView(R.layout. activity_data) ;

        final Intent intent = getIntent() ;
        final Bundle bundle = intent.getBundleExtra( "Bundle") ;
        Toast. makeText( this, bundle.getString( "Toast") Toast. LENGTH_SHORT).show() ;
    }
}

活动B返回到活动A 数据传输

活动B代码
public class DataActivity  extends AppCompatActivity {

    @Override
    protected void  onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState) ;
        setContentView(R.layout. activity_data) ;

        final Button button = (Button)findViewById(R.id. finish_btn) ;
        button.setOnClickListener( new View.OnClickListener() {
            @Override
            public void  onClick(View v) {
                Intent intent1 =  new Intent() ;
                intent1.putExtra( "Toast" "刚退出的Activity中,传来的信息!") ;
                setResult( 200 intent1) ;
                finish() ;
            }
        }) ;
    }
}


活动A代码
public class MainActivity  extends AppCompatActivity {

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

        Button dataBtn = (Button) findViewById(R.id.data_btn) ;
        dataBtn.setOnClickListener( new View.OnClickListener() {
            @Override
            public void  onClick(View v) {
                Intent intent =  new Intent(MainActivity. this, DataActivity. class) ;
                Bundle bundle =  new Bundle() ;
                bundle.putString( "Toast" "收到从MainActivity中传过来的数据") ;
                intent.putExtra( "Bundle" bundle) ;
                startActivityForResult(intent 100) ; //requestCode
            }
        }) ;
    }

    @Override
    /**
     * requestCode: 启动Activity的函数中设置的
     * resultCode: 退出的Activity里面传过来的
     */
    protected void  onActivityResult( int requestCode , int resultCode Intent data) {
        if (requestCode ==  100 && resultCode ==  200) {
            Toast.makeText( this, data.getStringExtra( "Toast") Toast.LENGTH_SHORT).show() ;
        }
    }

你可能感兴趣的:(android,intent)