时间: 2015-05-08 00:54 栏目: Android 浏览: 11486 赞: 11 踩: 0 字体: 大 中 小
以下为本篇文章全部内容:
好些日子没更新博文了,由于最近比较忙所以学习和博客都搁置了一段时间,今天难得有空就把博文更新一下,这次给大家更新的是Android多个Activity之间如果传递参数。大家都知道在web程序当中传参很方便,最常用的就是GET和POST,但在Android里面不像PHP之前那么容易传参怎么办呢?其实传参也很简单,只需借助Intent来完成即可。下面我将给大家介绍一下Intent和其作用。
什么是Intent(意图)
1、Intent是一种运行时绑定(Rruntime binding)机制,在能在程序运行的过程中连接两个不同的组件。通过Intent,你的程序可以想Android表达某种请求或者意愿,Android会根据一员的内容选择适合的组件来请求。
2、在这些组件之间的通讯中,主要是由Intent协助完成的。Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intern的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用
3、因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调着的解耦。
4、例如:在一个联系人维护的应用中,当我们在一个联系人列表屏幕(假设对应的Activity为listActivity)上,点击某个联系人后,希望能够跳出该联系人的详细信息(假设对应的Activity为detailActivity)
5、listActivity需要构造一个,这个Intent用于告诉系统,我们要做查看详细资料的动作,此动作对应的对象是某个联系人,然后调用startActivity(Intent intent),将构造成的Intent传入,系统会根据此Intent中的描述,到ManiFest中找到满足此Intent要求的Activity,系统会调用找到的Activity,即为detailActivity,最终传入Intent,detailActivity则会根据此Intent中的描述执行相应的操作
实现页面之间跳转的两种方法
1、startActivity(intent);//无返回值
2、startActivityForResult(intent,requestCode);//有返回值
在类重载onActivityResult方法
onActivityResult(int requestCode,int resultCode,Intent data);//在A页面使用,通过这个方法接收B页面的返回值
setResult(resultCode,data);//在B页面使用,通过这个方法给A页面设置返回值
使用方法
实例化Intent对象第一个参数为当前Activity对象,第二个参数为要跳转到的Activity
Intent intent = new Intent(MainActivity.this, ShowActivity.class);
常用方法
putExtra(key,value);//携带参数发送到另一个页面
putExtras(Bundle b);//传递Bundle类型的数据
startActivity(intent);//启动另一个页面,参数为实例化出来的Intent对象
setClass(当前Activity, 目标Activity.class);//当实例化空构造器的时候,可以通过该方法设置当前Activity和目标Activity
第二个页面获取参数
Intent intent = getIntent();//使用getIntent获取第一个页面传送过来的Intent对象
String name = intent.getStringExtra(key);//获取传送过来的字符串
Bundle b = intent.getExtras();//获取Bundle方式传过来的Bundle
1、静态变量传递数据
目标Activity的静态变量必须为public,否则无法使用
ShowActivity.name = "姓名";//目标Activity.目标Activity定义的静态变量
2、通过putExtra传递数据
putExtra(key,value);//携带参数发送到另一个页面
String name = intent.getStringExtra(key);//获取传送过来的字符串
3、剪切板传递数据
通过getSystemService(Context.CLIPBOARD_SERVICE)
ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
4、全局变量传递数据
创建一个类继承Application在设置变量,并设置get方法获取变量的值
在AndroidManifest.xml的application里面添加android:name=".Defind" //Defind为类名
defind = (Defind) getApplication();//在使用的类里面通过getApplication获取全局变量类的对象
5、数据包Bundle传递数据
Bundle b = new Bundle();//创建Bundle对象
b.putString('name','姓名');//往Bundle对象添加传递的参数
b.putInt('age',1);//往Bundle对象添加传递的参数
intent.putExtras(b);在intent里面添加Bundle对象
Bundle data = intent.getExtras();//获取传递过来的Bundle对象
data.getString('name');//通过Bundle对象的key获取值
data.getInt('age');////通过Bundle对象的key获取值
以上几种就是常用的传递数据的方法,今天我将会给大家讲讲其中四种,因为剪切板我只用过一次,感觉用到的地方不是太多,所以就给大家讲讲常用的剩下几种。
静态变量传递数据:
静态变量传递数据需要我们在即将打开的Activity当中设置静态变量,然后在第一个Activity对即将打开的Activity的静态变量进行赋值,例如我要在MainActivity点击按钮的时候打开ShowActivity,那么我就在ShowActivity里面设置一个全局的静态变量,然后在MainActivity对该变量进行赋值,可参考下面代码:
MainActivity代码
public class MainActivity extends Activity { private Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.button); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(MainActivity.this, ShowActivity.class);//实例化一个inent ShowActivity.age = 100;//设置静态变量传递的参数 startActivity(intent); } }); } }
ShowActivity代码:
public class ShowActivity extends Activity{ private TextView textview; public static int age; private Defind defind; protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_show); textview = (TextView) findViewById(R.id.textview); textview.setText("静态变量:"+age); } }
通过putExtra传递数据:
这个方法我个人比较喜欢这样用,因为我感觉这样很快捷很方便的解决了我传递参数,这个方法跟Bundle传递相类似,也可以说根本就是一样,只是Bundle需要实例化一个Bundle对象添加参数而已。使用putExtra比较方便,只需要在提交的Activity提交然后在即将打开的Activity进行接收就可以了,详细实例参考下面代码:
MainActivity代码
public class MainActivity extends Activity { private Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.button); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(MainActivity.this, ShowActivity.class);//实例化一个inent intent.putExtra("name", "大家好,我是Sunny");//为putExtra添加需要传递的参数 startActivity(intent); } }); } }
ShowActivity代码:
public class ShowActivity extends Activity{ private TextView textview; public static int age; private Defind defind; protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_show); textview = (TextView) findViewById(R.id.textview); Intent intent = getIntent();//获取一个intent对象 String name = intent.getStringExtra("name");//获取传递过来的值 textview.setText("putExtra传参:"+name); } }
全局变量传递数据:
这个方式支持开发者自己定义一个类来进行传参,但是该类需要在AndroidManifest.xml中声明出来,在AndroidManifest.xml的application里面添加android:name并给name赋值为类名,然后在类里面通过getApplication获取全局变量类的对象,再对该对象进行操作。在实例中我将用三个java源文件来演示分别是Defind.java、MainActivity.java、ShowActivity.java,参考代码如下:
先在AndroidManifest.xml中声明:
在application中添加android:name并且赋值是自己定义的类名
<application android:name=".Defind" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".ShowActivity" android:label="@string/app_name" ></activity> </application>
MainActivity代码:
public class MainActivity extends Activity { private Button button; private Defind defind; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); defind = (Defind) getApplication(); button = (Button) findViewById(R.id.button); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(MainActivity.this, ShowActivity.class);//实例化一个inent defind.setQq("327388905");//设置全局变量传递的参数 startActivity(intent); } }); } }
ShowActivity代码:
public class ShowActivity extends Activity{ private TextView textview; public static int age; private Defind defind; protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_show); textview = (TextView) findViewById(R.id.textview); defind = (Defind) getApplication();//获取全局变量的值 textview.setText("全局变量:"+defind.getQq()); } }
数据包Bundle传递数据:
该方式跟putExtra很相似,使用的是putExtras,但是在使用putExtras之前我们得先创建一个Bundle对象来存放我们的值,该方式用于传递比较复杂类型的数据。请看下面参考代码:
MainActivity代码:
public class MainActivity extends Activity { private Button button; private Defind defind; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.button); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(MainActivity.this, ShowActivity.class);//实例化一个inent Bundle b = new Bundle(); b.putString("web", "www.sunnyos.com"); b.putInt("views",1000); intent.putExtras(b); startActivity(intent); } }); } }
ShowActivity代码:
public class ShowActivity extends Activity{ private TextView textview; public static int age; private Defind defind; protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_show); textview = (TextView) findViewById(R.id.textview); Intent intent = getIntent();//获取一个intent对象 Bundle b = intent.getExtras(); textview.setText("Bundle提交:"+b.getString("web")+"浏览次数:"+b.getInt("views")); } }
以上几种方式就是我们常用到的Activity与Activity传递数据的方式。我把上面代码都综合到了一个简单的例子里面,大家也可以单独看以上代码,也可以直接全部看下面代码,下面代码我将会把AndroidManifest.xml、Defind.java、MainActivity.java、ShowActivity.java、activity_main.xml、activity_show.xml所用到的java代码和布局文件都放出来
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.sunny" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" /> <application android:name=".Defind" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".ShowActivity" android:label="@string/app_name" ></activity> </application> </manifest>
Defind.java:
public class Defind extends Application { public String qq; public String getQq() { return qq; } public void setQq(String qq) { this.qq = qq; } }
MainActivity.java:
public class MainActivity extends Activity { private Button button; private Defind defind; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); defind = (Defind) getApplication(); button = (Button) findViewById(R.id.button); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(MainActivity.this, ShowActivity.class);//实例化一个inent intent.putExtra("name", "我是谁");//为putExtra添加需要传递的参数 defind.setQq("327388905");//设置全局变量传递的参数 ShowActivity.age = 100;//设置静态变量传递的参数 Bundle b = new Bundle(); b.putString("web", "www.sunnyos.com"); b.putInt("views",1000); intent.putExtras(b); startActivity(intent); } }); } }
ShowActivity.java:
public class ShowActivity extends Activity{ private TextView textview; public static int age; private Defind defind; protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_show); textview = (TextView) findViewById(R.id.textview); defind = (Defind) getApplication();//获取全局变量的值 Intent intent = getIntent();//获取一个intent对象 String name = intent.getStringExtra("name");//获取putExtra提交的值 Bundle b = intent.getExtras(); textview.setText("putExtra提交:"+name+"\r\n静态变量:"+age+"\r\n全局变量:"+defind.getQq()+"\r\nBundle提交:"+b.getString("web")+"浏览次数:"+b.getInt("views")); Button button = (Button) findViewById(R.id.show_button); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub finish(); } }); } }
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/button1" /> </LinearLayout>
activity_show.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/textview" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/show_button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/show_button" /> </LinearLayout>
以上代码执行之后的效果图如下:
谢谢大家对本博客的支持,本站专注原创技术文章,三更半夜做实验写文章不易,且看且珍惜博主的心得。请转载带上本文链接注明出处。
扫二维码快速加群:
如果大家有什么疑问可以加我QQ327388905进行解答,也可以加入交流群
总赞数量:18274
总踩数量:128087
文章数量:29