Android Activity学习 <二> Activity间通讯

来源:互联网 发布:840Mgpu安装tensorflow 编辑:程序博客网 时间:2024/06/01 19:56
1. Intent在Activity间通讯的使用

1.1: 使用Intent启动其它Activity:
Activity可以调用 
void startActivity (Intentintent)方法来启动其它Activity。不论此Activity在同一个进程内,还是在不同进程。

在同一进程内,可以使用显式Intent。 不同进程中,则使用隐式Intent.

我们统一按照不同进程内的方式启动其它Activity:

例1:
Sam有个测试程序,其APK为:HelloJni.apk。其安装在Android系统之后,其APK存放在。
/data/app/com.example.hellojni-1.apk

现在,我要使用Intent来启动此APK安装后的应用程序的Activity。

Intent i = new Intent();

PackageManager pm = getPackageManager(); //得到PackageManager

//通过PackageManager得到指定APK文件的信息,注意 GET_ACTIVITIES,是指填充Info.activites[] 

PackageInfo Info =pm.getPackageArchiveInfo("/data/app/com.example.hellojni-1.apk" ,PackageManager.GET_ACTIVITIES);  

//Info.packageName: 包名。 Info.activities[0].name:第一个Activity的类名。
Log.w("3DiJoy", String.format("PackageName:[%s]. Version:[%s].class name:[%s]", Info.packageName, Info.versionName,Info.activities[0].name));

//
ComponentName comp = newComponentName(Info.packageName,Info.activities[0].name);
i.setComponent(comp);

startActivity(i);

则其它进程的Activity被启动起来。



1.2:使用 Intent启动其它Activity时传递信息:
Intent有一个传递数据的机制。
Intent putExtra()发送,getXXXExtra系列函数接收。

其中,putExtra()参数一为关键字。getXXXExtra() 则通过此关键字得到其值。
可以传送的信息很多:如bool,String,int,char,float....

例2:
HelloJni.apk。其安装在Android系统之后,其APK存放在。启动之,并传递一个bool,两个String。


Intent i = new Intent();

PackageManager pm =getPackageManager();  //得到PackageManager

//通过PackageManager得到指定APK文件的信息,注意 GET_ACTIVITIES,是指填充Info.activites[] 

PackageInfo Info =pm.getPackageArchiveInfo("/data/app/com.example.hellojni-1.apk" ,PackageManager.GET_ACTIVITIES);  

//Info.packageName: 包名。 Info.activities[0].name:第一个Activity的类名。
Log.w("3DiJoy",String.format("PackageName:[%s]. Version:[%s]. class name:[%s]",Info.packageName, Info.versionName,Info.activities[0].name));

//
ComponentName comp = newComponentName(Info.packageName,Info.activities[0].name);
i.setComponent(comp);
i.putExtra("Bool_Key", true);
i.putExtra("String_Key1", "ABC");
i.putExtra("String_Key2", "EFB");

startActivity(i); 



此时,在被启动的Activity的onCreate中。添加如下:
Intent intent=getIntent(); 
intent.getBooleanExtra("Bool_Key",false); 
String S2 =intent.getStringExtra("String_Key2"); 
String S1 = intent.getStringExtra("String_Key1");
Log.w("3DiJoy", "String1:" + S1);
Log.w("3DiJoy", "String2:" + S2);

通过logcat发现信息被正确传递。



1.3: 使用Intent启动其它Activity时利用bundle传递信息:
发送端:
Intent i = new Intent();
Bundle bundle = new Bundle();

PackageManager pm =getPackageManager();  //得到PackageManager

//通过PackageManager得到指定APK文件的信息,注意 GET_ACTIVITIES,是指填充Info.activites[] 

PackageInfo Info =pm.getPackageArchiveInfo("/data/app/com.example.hellojni-1.apk" ,PackageManager.GET_ACTIVITIES);  

//Info.packageName: 包名。 Info.activities[0].name:第一个Activity的类名。
Log.w("3DiJoy",String.format("PackageName:[%s]. Version:[%s]. class name:[%s]",Info.packageName, Info.versionName,Info.activities[0].name));

//
ComponentName comp = newComponentName(Info.packageName,Info.activities[0].name);
i.setComponent(comp);
bundle.putBoolean("bool_Key", true); 
bundle.putString("String_key1", "Sam Info: ");
i.putExtra("Sam_Key", bundle); //Bundle名为:Sam_Key。接收端要使用

startActivity(i); 



接收端:
Intent intent= getIntent(); 
Bundle bundle = intent.getBundleExtra("Sam_Key");//通过Bundle名寻找
if(bundle == null)
     Log.w("3DiJoy", "No Found bundle");
else
{
       bundle.getBoolean("bool_Key");
       String s1 =bundle.getString("String_key1");
       Log.w("3DiJoy", "###############String1:" +s1);
}



1.4: 使用Intent启动其它Activity时传递信息,并在其它Activity退出时得到返回值:

发送端使用:
startActivityForResult(i, 4);
也就是说:Request Code为4。

并使用onActivityResult() 接收子Activity返回时的值。
@Override
protected void onActivityResult(int requestCode, intresultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
Log.w("3DiJoy", String.format("RequestCode:[%d].Get Recode :[%d]", requestCode, resultCode));
}


子Activity中添加:
setResult(RESULT_FIRST_USER);

则在父Activity中,可以得到此值。


 

1.5: 使用Intent启动其它Activity时传递信息,并在其它Activity退出时得到返回信息:
发送端使用:
startActivityForResult(i,4);
也就是说:RequestCode为4。

并使用onActivityResult()接收子Activity返回时的值。
@Override
protected void onActivityResult(intrequestCode, int resultCode, Intent data) {
// TODO Auto-generated methodstub
super.onActivityResult(requestCode, resultCode, data);
data.getBooleanExtra("Bool_Key", false);
String S2 =data.getStringExtra("String_Key2"); 
String S1 = data.getStringExtra("String_Key1");
Log.w("3DiJoy", "String1:" + S1);
Log.w("3DiJoy", "String2:" + S2);
Log.w("3DiJoy",String.format("RequestCode:[%d].Get Recode : [%d]", requestCode,resultCode));
}
0 0
原创粉丝点击