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.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.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.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;
}
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) ;
}
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。
参考:
隐式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>
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() ;
}
}
}) ;
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) {
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) ;
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") ;
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) ;
}
}) ;
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() ;
}
}
@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() ;
}
}) ;
}
}
@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() ;
}
}
}
@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() ;
}
}
}