name="com.example.activitytest.MY_CATEGORY"/>
隐式Intent不仅可以启动自己程序内的活动,还可以启动其他程序的活动
修改FirstActivity中按钮点击事件的代码,如下所示:
button1.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
Intentintent=newIntent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(""));
startActivity(intent);
}
});
指定了Intent的action是Intent.ACTION_VIEW,这是一个Android系统内置的动作,其常量值为android.intent.action.VIEW。
然后通过Uri.parse()方法,将一个网址字符串解析成一个Uri对象,再调用Intent的setData()方法将这个Uri对象传递进去
setData()接收一个Uri对象,主要用于指定当前Intent正在操作的数据,而这些数据通常都是以字符串的形式传入到Uri.parse()方法中解析产生的
在标签中再配置一个标签,可以更精确地指定当前活动能够响应什么类型的数据。
标签中主要可以配置以下内容。
1.android:
scheme
用于指定数据的协议部分,如上例中的http部分。
2.android:
host
用于指定数据的主机名部分,如上例中的部分。
3.android:
port
用于指定数据的端口部分,一般紧随在主机名之后。
4.android:
path
用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。
5.android:
mimeType
用于指定可以处理的数据类型,允许使用通配符的方式进行指定。
putExtra()方法的重载,可以把我们想要传递的数据暂存在Intent中,启动了另一个活动后,只需要把这些数据再从Intent中取出就可以了
字符串传递到SecondActivity中:
button1.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
Stringdata="HelloSecondActivity";
Intentintent=newIntent(FirstActivity.this,SecondActivity.class);
intent.putExtra("extra_data",data);
startActivity(intent);
}
});
这里putExtra()方法接收两个参数,第一个参数是键,用于后面从Intent中取值,第二个参数才是真正要传递的数据
在SecondActivity中将传递的数据取出,并打印出来:
publicclassSecondActivityextendsActivity{
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.second_layout);
Intentintent=getIntent();
Stringdata=intent.getStringExtra("extra_data");
Log.d("SecondActivity",data);
}
}
通过getIntent()方法获取到用于启动SecondActivity的Intentt,然后调用getStringExtra()方法,传入相应的键值,就可以得到传递的数据
Activity中有一个startActivityForResult()方法也是用于启动活动的,但这个方法期望在活动销毁的时候能够返回一个结果给上一个活动
button1.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
Intentintent=newIntent(FirstActivity.this,SecondActivity.class);
startActivityForResult(intent,1);
}
});
使用startActivityForResult()方法来启动SecondActivity
startActivityForResult()方法接收两个参数,第一个参数还是Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源
publicclassSecondActivityextendsActivity{
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.second_layout);
Buttonbutton2=(Button)findViewById(R.id.button_2);
button2.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
Intentintent=newIntent();
intent.putExtra("data_return","HelloFirstActivity");
setResult(RESULT_OK,intent);
finish();
}
});
}
}
setResult()方法接收两个参数,第一个参数用于向上一个活动返回处理结果,一般只使用RESULT_OK或RESULT_CANCELED这两个值,第二个参数则是把带有数据的Intent传递回去,然后调用了finish()方法来销毁当前活动。
由于我们是使用startActivityForResult()方法来启动SecondActivity的,在SecondActivity被销毁之后会回调上一个活动的onActivityResult()方法,因此我们需要在FirstActivity中重写这个方法来得到返回的数据,如下所示:
@Override
protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
switch(requestCode){
case1:
if(resultCode==RESULT_OK){
StringreturnedData=data.getStringExtra("data_return");
Log.d("FirstActivity",returnedData);
}
break;
default:
}
}
onActivityResult()方法带有三个参数,第一个参数requestCode,即我们在启动活动时传入的请求码。
第二个参数resultCode,即我们在返回数据时传入的处理结果。
第三个参数data,即携带着返回数据的Intent
重写onBackPressed()方法,通过按下Back键回到FirstActivity
@Override
publicvoidonBackPressed(){
Intentintent=newIntent();
intent.putExtra("data_return","HelloFirstActivity");
setResult(RESULT_OK,intent);
finish();
}
用户按下Back键,就会去执行onBackPressed()方法中的代码
启动模式一共有standard、singleTop、singleTask和singleInstance四种,可以在AndroidManifest.xml中通过给标签指定android:
launchMode属性来选择启动模式
standard是活动默认的启动模式
singleTop模式可以防止重复创建栈顶活动
singleTask模式只存在一个实例
singleInstance模式实现其他程序和我们的程序可以共享这个活动的实例,共用同一个返回栈
UI
常见控件
TextView
Button
EditText
ImageView
ProgressBar
AlertDialog
ProgressDialog
基本布局
LinearLayout
RelativeLayout
FrameLayout
TableLayout
android:
gravity是用于指定文字在控件中的对齐方式,而android:
layout_gravity是用于指定控件在布局中的对齐方式
android:
layout_weight属性使用比例的方式来指定控件的大小
在TableLayout中每加入一个TableRow就表示在表格中添加了一行
自定义控件
android="
android:
layout_width="match_parent"
android:
layout_height="match_parent">
通过include语句将布局引入
publicclassTitleLayoutextendsLinearLayout{
publicTitleLayout(Contextcontext,AttributeSetattrs){
super(context,attrs);
LayoutInflater