Android 中 Intent学习记录
Intent的作用:
Intent 是一个将要执行的动作的抽象的描述,一般来说是作为参数来使用,由Intent来协助完成android各个组件之间的通讯。比如说调用startActivity()来启动一个activity,或者由broadcaseIntent()来传递给所有感兴趣的BroadcaseReceiver, 再或者由startService()/bindservice()来启动一个后台的service.所以可以看出来,intent主要是用来启动其他的activity 或者service,所以可以将intent理解成activity之间的粘合剂。
1.Intent 拨打电话 和 发送短信
前台布局源码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="电话号码 :" /> <EditText android:id="@+id/txt_phone" android:layout_width="fill_parent" android:layout_height="wrap_content" android:inputType="phone" android:text="13621614475"/> <Button android:id="@+id/btn_call" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right" android:text="拨打电话"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="短信内容"/> <EditText android:id="@+id/txt_message" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="shanghai"/> <Button android:id="@+id/btn_GSM" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right" android:text="发送短信"/> </LinearLayout>
后台文件拨号 及 短信发送:
private EditText txt_phone=null; private EditText txt_message=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //电话号码 txt_phone=(EditText)findViewById(R.id.txt_phone); //拨打电话 Button btn_call=(Button)findViewById(R.id.btn_call); btn_call.setOnClickListener(listener); //短信内容 txt_message=(EditText)findViewById(R.id.txt_message); //发送短信 Button btn_gsm=(Button)findViewById(R.id.btn_GSM); btn_gsm.setOnClickListener(listener); } private OnClickListener listener=new OnClickListener(){ @Override public void onClick(View view) { Button btn=(Button)view; switch (btn.getId()) { case R.id.btn_call: { Intent intent=new Intent(); intent.setAction(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:"+txt_phone.getText())); startActivity(intent); } break; case R.id.btn_GSM: { Intent intent=new Intent(Intent.ACTION_SENDTO,Uri.parse("smsto:5554")); intent.putExtra("sms_body",txt_message.getText().toString()); startActivity(intent); } default: break; } }};
注意:必须要在配置文件中添加一些两句声明,不然的话会发送错误。 在<application>的外面添加 以下两句声明
<!-- 拨打电话 --> <uses-permission android:name="android.permission.CALL_PHONE"/> <!-- 发送短信 --> <uses-permission android:name="android.permission.SEND_SMS"/>
整天效果图: 点击:拨打电话按钮 图
点击 发送短信按钮 图为:
2.Intent 启动Activity 及 向一个新的Activity 传值。
源码:
//启动一个Activity Button btn_startSecond=(Button)findViewById(R.id.btn_startSecond); btn_startSecond.setOnClickListener(listenerStartSecond);
private OnClickListener listenerStartSecond=new OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(MainActivity.this,SecondActivity.class); intent.putExtra("Name", "张三"); startActivity(intent); } };
启动的SecondActivity 中 获取传入的值:
布局源码:
<TextView android:id="@+id/tv_info" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="@string/hello_world" /> <Button android:id="@+id/btn_second" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Second"/>
获取值 后台源码:
private TextView tv_info=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); Intent intent=getIntent(); Bundle bundle=intent.getExtras(); String name=bundle.getString("Name"); tv_info=(TextView)findViewById(R.id.tv_info); tv_info.setText(name); }
注意:在AndroidMainfest.xml 中添加 要启动的SecondActivity的声明: 在 <application>的内部添加如下声明
<!-- 启动一个Activity 在此声明要启动的Activity --> <activity android:name="com.example.intent2.SecondActivity" android:label="@string/title_activity_second" > </activity>
2.1 在SecondActivity关闭时,返回参数并传值给 mainActivity的处理:
MainActivity后台源码:
//启动一个Activity Button btn_startSecond=(Button)findViewById(R.id.btn_startSecond); btn_startSecond.setOnClickListener(listenerStartSecond);
//定一个常量 public final static int REQUESTCODE=1; private OnClickListener listenerStartSecond=new OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(MainActivity.this,SecondActivity.class); intent.putExtra("Name", "张三"); //启动一个Activity //startActivity(intent); MainActivity.this.startActivityForResult(intent, REQUESTCODE); } }; //覆盖次方法 用与获取 SecondActivity 在结束时 获取参数的返回值 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode==REQUESTCODE) { if(resultCode==SecondActivity.RESULTCODE) { Bundle bundle=data.getExtras(); String backData=bundle.getString("Back"); Toast.makeText(MainActivity.this, backData, Toast.LENGTH_LONG).show(); } } }
SecondActivity源码:
private TextView tv_info=null; private Button btn_startSencond=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); Intent intent=getIntent(); Bundle bundle=intent.getExtras(); String name=bundle.getString("Name"); tv_info=(TextView)findViewById(R.id.tv_info); tv_info.setText(name); btn_startSencond=(Button)findViewById(R.id.btn_second); btn_startSencond.setOnClickListener(listener); } public final static int RESULTCODE=1; //返回参数值 private OnClickListener listener=new OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(); intent.putExtra("Back", "SecondActivity:参数返回值"); //设置参数返回值 SecondActivity.this.setResult(RESULTCODE, intent); //结束SecondActivity finish(); } };
配置文件别忘记添加:
<!-- 启动一个Activity 在此声明要启动的Activity --> <activity android:name="com.example.intent2.SecondActivity" android:label="@string/title_activity_second" > </activity>
效果图: 点击Second按钮 返回MainActivity 并传递返回值:
2.2 调出拨号程序:
public void onClick(View v) { Uri uri = Uri.parse("tel:"); Intent intent = new Intent(Intent.ACTION_DIAL, uri); startActivity(intent); }
效果图:
2.3 调用短信程序:
@Override public void onClick(View v) { Uri uri = Uri.parse("smsto:"); Intent intent=new Intent(); intent.putExtra("sms_body", "The SMS text"); intent.setType("vnd.android-dir/mms-sms"); startActivity(intent); }
效果图:
2.4 发送Email 邮件
1. Uri uri = Uri.parse("mailto:xxx@abc.com");
2. Intent it = new Intent(Intent.ACTION_SENDTO, uri);
3. startActivity(it);
1. Intent it = new Intent(Intent.ACTION_SEND);
2. it.putExtra(Intent.EXTRA_EMAIL, "me@abc.com");
3. it.putExtra(Intent.EXTRA_TEXT, "The email body text");
4. it.setType("text/plain");
5. startActivity(Intent.createChooser(it, "Choose Email Client"));
1. Intent it=new Intent(Intent.ACTION_SEND);
2. String[] tos={"me@abc.com"};
3. String[] ccs={"you@abc.com"};
4. it.putExtra(Intent.EXTRA_EMAIL, tos);
5. it.putExtra(Intent.EXTRA_CC, ccs);
6. it.putExtra(Intent.EXTRA_TEXT, "The email body text");
7. it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");
8. it.setType("message/rfc822");
9. startActivity(Intent.createChooser(it, "Choose Email Client"));
1. //传送附件
2. Intent it = new Intent(Intent.ACTION_SEND);
3. it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");
4. it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/mysong.mp3");
5. sendIntent.setType("audio/mp3");
6. startActivity(Intent.createChooser(it, "Choose Email Client"));
本人写着这里。希望阅读者提出不足之处,互相学习提高。