一、第一个Activity
1.1 创建一个空Activity
1.2 创建一个布局
知识点
在XML中引用一个id:@id/id_name
在XML中定义一个id:@+id/id_name
右键错误,点击Show Quick-Fixes
,再点击弹出的Suppress:Add........
,错误会被自动修复
1.3 在AndroidManifest.xml文件中注册
现在程序就可以运行了
1.4 在活动中使用Toast
Toast:显示短小的信息,起到提醒作用
(不必纠结此处代码的语法)
效果:
1.5 在活动中使用Menu
回到FirstActivity,重写onCreateOptionsMenu()
方法【按下Ctrl+o
,可生成部分代码】
此时菜单就可正常打开了
之后为菜单添加事件
在FirstActivity中重写onOptionsItemSelected()
方法【操作方法同上】
@Overridepublic boolean onOptionsItemSelected(@NonNull MenuItem item) {if (item.getItemId() == R.id.add_item) {Toast.makeText(this,"你点击了add",Toast.LENGTH_SHORT).show();}else if(item.getItemId()==R.id.remove_item){Toast.makeText(this,"你点击了remove",Toast.LENGTH_SHORT).show();}return super.onOptionsItemSelected(item);}
效果如下:
1.6 销毁一个活动
- Android中的Back按键【就是返回键】
- Activity类中的finish()方法
第二种,把finish()方法写进button1中,之后点击button1,活动就会关闭
button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {finish();//点击button1,活动就会关闭}
});
二、活动之间的切换(Intent)
Intent
- 可以指明当前组件想执行的动作
- 可以在不同组件之间传递数据
2.1 显式Intent
启动SecondActivity
新建一个名为SecondActivity
的Activity
修改FirstActivity中button1的代码,使其能启动SecondActivity
button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//启动SecondActivityIntent intent=new Intent(FirstActivity.this, SecondActivity.class);startActivity(intent);}
});
效果如下
2.2 隐式Intent
隐式Intent不知名我们要启动哪一个活动,系统分析这个Intent,之后帮我们找出合适的活动去启动。
- 合适的活动:可以 响应 该隐式Intent的活动
注意
- < action >和< category >同时匹配时,才可响应
- 每个Intent只能指定一个action,却可以指定多个category
默认的category
修改SecondActivity的 < Activity >标签
修改FirstActivity中button1的代码,使其能启动SecondActivity
button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//启动SecondActivityIntent intent=new Intent("com.example.noactivity.ACTTION_START");//不需要添加category,因为刚才xml中的是默认categorystartActivity(intent);}
});
之后启动,点击FirstActivity中button1,能启动SecondActivity
不用默认的category
修改SecondActivity的 < Activity >标签
修改FirstActivity中button1的代码,使其能启动SecondActivity
button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//启动SecondActivityIntent intent=new Intent("com.example.noactivity.ACTTION_START");intent.addCategory("com.example.noactivity.MY_CATEGORY");//指定的categorystartActivity(intent);}
});
之后启动,点击FirstActivity中button1,能启动SecondActivity
2.2 隐式Intent【打开浏览器】
修改FirstActivity中button1的onClick()代码
button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//指定了Intent的action是Intent.ACTION_VIEWIntent intent = new Intent(Intent.ACTION_VIEW);//用Uri.parse(),将网址解析为一个Uri对象。再调用Intent的setData()方法将该Uri对象传进去intent.setData(Uri.parse("http://www.baidu.com"));startActivity(intent);}
});
效果
2.3 隐式Intent【新建一个活动,使其能响应打开网站的Intent】
- < intent-filter >中可再配置一个< data >标签,可以指定当前活动可以响应什么类型的数据
标签 | 说明 |
---|---|
android:scheme | 协议,如http |
android:host | 主机名,如www.baidu.com |
android:port | 端口,一般紧跟主机名之后 |
android:path | 主机名和端口之后的部分 |
android:mimeType | 指定可以处理的数据类型 |
创建活动,名为ThirdActivity
,布局名为third_layout
。
在third_layout.xml
中添加button
<Buttonandroid:id="@+id/button_3"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Button 3"tools:ignore="MissingConstraints" />
修改AndroidManifest.xml
中ThirdActivity的部分
<activityandroid:name=".ThirdActivity"android:exported="true" ><intent-filter tools:ignore="AppLinkUrlError"><action android:name="android.intent.action.VIEW"/><category android:name="android.intent.category.DEFAULT"/><data android:scheme="http"/></intent-filter></activity>
此时ThirdActivity
也可响应button1访问http://www.baidu.com的intent
2.4 隐式Intent【调用系统拨号页面】
修改button按键的onClick()方法。
主要看的是Intent 的action
button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(Intent.ACTION_DIAL);intent.setData(Uri.parse("tel:10086")); //String转Uri,再通过setData()传入intentstartActivity(intent);}
});
效果
2.5 向下一个活动传递数据
思路:把数据存放在intent中,启动另一个活动后,把这些数据从intent中取出即可
intent.putExtra()
getIntent()
intent.getStringExtra("extra_data")
在FirstActivity中启动SecondActivity
button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String data = "Hello SecondActivity";//要发送的数据Intent intent = new Intent(FirstActivity.this, SecondActivity.class);//intentintent.putExtra("extra_data",data);//两个参数,(“键”,“要传递的数据”)startActivity(intent);}
});
在SecondActivity中取出数据,并打印出来
public class SecondActivity extends AppCompatActivity {private static final String TAG = "SecondActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.second_layout);Intent intent=getIntent();//获取intentString data=intent.getStringExtra("extra_data");//键Log.d(TAG, data);//在logcat中打印数据}
}
logcat中的数据
2.5 返回数据给上一个活动
startActivityForResult();
:该方法期望在活动销毁时能够返回一个结果给上一个活动putExtra()
setResult()
onActivityResult()
在FirstActivity中启动SecondActivity
button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(FirstActivity.this, SecondActivity.class);//intentstartActivityForResult(intent,1);//参数(intent,请求码)}
});
SecondActivity中button事件。点击后SecondActivity结束,返回数据(在intent中)
button2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent();intent.putExtra("data_return","Hello FirstActivity");setResult(RESULT_OK,intent);//向上一个活动返回数据(数据在intent中)finish();//结束SecondActivity}
});
覆写FirstActivity中的onActivityResult()
方法,以获取返回数据
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);switch (requestCode) {//根据请求码,进入不同的分支case 1:if (resultCode == RESULT_OK) {String returnedData = data.getStringExtra("data_return");//根据键值,获取返回数据Log.d("FirstActivity", returnedData);}break;case 2:break;default:}
}
结果:
参考
第一行代码,郭霖