intent
Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
两个重要属性:action、data。
1、意图传递数据的第一种方法
Mainactivity(启动意图,使用意图传递数据)
public class Android_intent1Activity extends Activity {
/** Called when the activity is first created. */
private Button button;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);//加载布局文件
button = (Button)this.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
// TODO Auto-generated method stub
Intent intent = new Intent(Android_intent1Activity.this, Otheractivity.class);
//在意图中传递数据
intent.putExtra("name", "wangbadan");
intent.putExtra("age", 22);
intent.putExtra("height", 56.8);
//启动意图
startActivity(intent);
}
});
}
}
对应的布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="android中意图传递数据" />
</LinearLayout>
Otheractivity(接收意图中的数据)
public class Otheractivity extends Activity
{
private TextView textview;
@Override
protected void onCreate(Bundle savedInstanceState)
{
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.other);
textview = (TextView)this.findViewById(R.id.msg);
Intent intent = getIntent();
int age = intent.getIntExtra("age",0);
String name = intent.getStringExtra("name");
double height = intent.getDoubleExtra("height", 0.0);
textview.setText("age-->"+age+"name-->"+name+"height-->"+height);
}
}
对应的布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/msg"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</LinearLayout>
<activity android:name=".Otheractivity"></activity>
不要忘了将这句加到主布局文件当中。
2、通过静态变量传递数据
Mainactivity
public class Mainactivity extends Activity {
/** Called when the activity is first created. */
private Button button;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button = (Button)this.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setClass(Mainactivity.this, Otheractivity.class);
Otheractivity.age = 33;
Otheractivity.name = "wangbadan";
startActivity(intent);
}
});
}
}
otheractivity
package com.android.test2;
import android.R.layout;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class Otheractivity extends Activity
{
private TextView textView;
public static String name;
public static int age;
@Override
protected void onCreate(Bundle savedInstanceState)
{
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.other);
textView = (TextView)this.findViewById(R.id.msg);
textView.setText("name-->"+name+" age->>"+age);
}
}
3、使用全局变量传递数据
创建一个全局变类(继承application)
在create时,给其一个初始值
public class Myapp extends Application
{
public String name;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
@Override
public void onCreate()
{
// TODO Auto-generated method stub
super.onCreate();
setName("zhangsan");
}
}
Main类中修改全局变量的值
public class Android_appActivity extends Activity {
/** Called when the activity is first created. */
private Button button;
private Myapp myapp;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button = (Button)this.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
// TODO Auto-generated method stub
myapp = (Myapp)getApplication();
myapp.setName("jack");
Intent intent = new Intent(Android_appActivity.this,Otheractivity.class);
startActivity(intent);
}
});
}
}
other类中获取全局变量的值
public class Otheractivity extends Activity
{
private TextView textview;
private Myapp myapp;
@Override
protected void onCreate(Bundle savedInstanceState)
{
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.other);
textview = (TextView)this.findViewById(R.id.msg);
myapp = (Myapp)getApplication();
textview.setText(myapp.getName());
}
}
<application
android:name=".Myapp" //最后在布局文件中需加入全局变量的一个名称。
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".Android_appActivity"
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=".Otheractivity"></activity>
</application>
4、使用剪切板传递数据
<pre name="code" class="java">public void onClick(View v)
{
// TODO Auto-generated method stub
//从android系统中调用剪切板的服务
ClipboardManager clipboardManager = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
String name = "wangba";
clipboardManager.setText(name);
Intent intent = new Intent(Main.this,Other.class);
startActivity(intent);
}
从另一个activity中获取数据
<pre name="code" class="java">textView = (TextView)this.findViewById(R.id.msg);
ClipboardManager clipboardManager = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
String str = clipboardManager.getText().toString();
textView.setText(str);
传递序列化的数据
创建一个类,接口为Serializable
package com.android.test3;
import java.io.Serializable;
public class Mydata implements Serializable
{
private String name;
private int age;
public Mydata(String name, int age)
{
super();
this.name = name;
this.age = age;
}
@Override
public String toString()
{
return "Mydata [name=" + name + ", age=" + age + "]";
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
public Mydata()
{
// TODO Auto-generated constructor stub
}
}
Main中监听的主要操作
public void onClick(View v)
{
Mydata mydata = new Mydata("jack", 23);
//将对象转换为字符串
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
String base64String = "";
try
{
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(mydata);
base64String = Base64.encodeToString(byteArrayOutputStream.toByteArray(), Base64.DEFAULT);
objectOutputStream.close();
} catch (Exception e)
{
// TODO: handle exception
}
ClipboardManager clipboardManager = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
clipboardManager.setText(base64String);
Intent intent = new Intent(Main.this,Other.class);
startActivity(intent);
}
other类中取数据操作
textView = (TextView)this.findViewById(R.id.msg);
ClipboardManager clipboardManager = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
String str = clipboardManager.getText().toString();
byte[] base64_byte = Base64.decode(str, Base64.DEFAULT);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(base64_byte);
try
{
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
mydata = (Mydata)objectInputStream.readObject();
textView.setText(mydata.toString());
}
catch (Exception e)
{
// TODO: handle exception
}