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 代表数据源,是<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()
;
}
}
}