文章出处:http://blog.youkuaiyun.com/scarthr/article/details/42190727
前面我们在讲Activity的时候已经说过,在使用Intent启动Activity的时候有两种方式,一种是显示的,一种是隐士的,那么隐士的就可能会有多个与之适配,我们调用系统窗口便是使用了Intent的隐士启动。
一 调用系统窗口
我们在布局中定义了许多按钮,点击每一个按钮都会调用一个不同的系统窗口,我们直接看Java代码:
package com.thr.testsysactivity;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnCall = (Button) findViewById(R.id.btnCall);
Button btnTouchDialer = (Button) findViewById(R.id.btnTouchDialer);
Button btnDial = (Button) findViewById(R.id.btnDial);
Button btnWeb = (Button) findViewById(R.id.btnWeb);
Button btnAudio = (Button) findViewById(R.id.btnAudio);
Button btnGoHome = (Button) findViewById(R.id.btnGoHome);
Button btnContactList = (Button) findViewById(R.id.btnContactList);
Button btnSettings = (Button) findViewById(R.id.btnSettings);
Button btnWifiSettings = (Button) findViewById(R.id.btnWifiSettings);
btnCall.setOnClickListener(this);
btnTouchDialer.setOnClickListener(this);
btnDial.setOnClickListener(this);
btnWeb.setOnClickListener(this);
btnAudio.setOnClickListener(this);
btnGoHome.setOnClickListener(this);
btnContactList.setOnClickListener(this);
btnSettings.setOnClickListener(this);
btnWifiSettings.setOnClickListener(this);
}
@Override
public void onClick(View view) {
try {
switch (view.getId()) {
// 拨打电话
case R.id.btnCall:
Intent callIntent = new Intent(Intent.ACTION_CALL,
Uri.parse("tel:12345678"));
startActivity(callIntent);
break;
case R.id.btnTouchDialer:
// 打开电话拨号器
Intent touchDialerIntent = new Intent(
"com.android.phone.action.TOUCH_DIALER");
startActivity(touchDialerIntent);
break;
case R.id.btnDial:
// 打开电话拨号器并传入电话
Intent dialIntent = new Intent(Intent.ACTION_DIAL,
Uri.parse("tel:87654321"));
startActivity(dialIntent);
break;
case R.id.btnWeb:
// 打开浏览器浏览网页
Intent webIntent = new Intent(Intent.ACTION_VIEW,
Uri.parse("http://blog.youkuaiyun.com/nokiaguy"));
startActivity(webIntent);
break;
case R.id.btnContactList:
// 打开联系人列表
Intent contactListIntent = new Intent(
"com.android.contacts.action.LIST_CONTACTS");
startActivity(contactListIntent);
break;
case R.id.btnSettings:
// 打开系统设置
Intent settingsIntent = new Intent("android.settings.SETTINGS");
startActivity(settingsIntent);
break;
case R.id.btnWifiSettings:
// 打开Wifi设置
Intent wifiSettingsIntent = new Intent(
"android.settings.WIFI_SETTINGS");
startActivity(wifiSettingsIntent);
break;
case R.id.btnAudio:
// 打开音频文件
Intent audioIntent = new Intent(Intent.ACTION_GET_CONTENT);
audioIntent.setType("audio/*");
startActivity(Intent.createChooser(audioIntent, "选择音频程序"));
break;
case R.id.btnGoHome:
// 返回到Home界面
Intent gohomeIntent = new Intent("android.intent.action.MAIN");
gohomeIntent.addCategory("android.intent.category.HOME");
startActivity(gohomeIntent);
break;
}
} catch (Exception e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
}
}
}
每一个按钮所执行的方法参数已经写的很清楚了,需要的时候直接调用即可。
二 调用系统窗口细节
当时用Intent进行隐式启动系统Activity的时候,一共有3个相对比较重要的属性可以设置:action、category、data。通过查看系统源码我们可以看到系统Activity在Manifest的intent-filter中基本都写了这3个属性。当我们应用的Intent隐式启动是,满足这3个参数的intent-filter,就会调用系统的Activity。
值得注意的是:如果我们调用Intent的setData方法,系统就会将Type设置成null,如果调用setType方法,系统就会将data设为null,只有在调用setDataAndType方法时才会一起设置好。
源码下载