@+id/id_name //创建id
@id/id_name //引用id
创建菜单
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/item_add"
android:title="ADD"/>
<item
android:id="@+id/item_delete"
android:title="DELETE"/>
</menu>
//创建菜单
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main,menu);
return true;
}
//选中菜单选项后的事件
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.item_add:
Toast.makeText(this, "Add!!", Toast.LENGTH_SHORT).show();
break;
case R.id.item_delete:
Toast.makeText(this, "Delete!!", Toast.LENGTH_SHORT).show();
break;
default:
}
return true;
}
通过隐式intent跳转到浏览器页面
mBtnWebPage=findViewById(R.id.bth_webpage);
mBtnWebPage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.ywrby.cn")); //利用这种方法还可以跳转拨号界面,调用地理位置等等
startActivity(intent);
}
});
向下一个/上一个活动传递数据
主页面
package com.example.activitytext;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取下一个页面返回的数据
Button bt1=findViewById(R.id.bt_getdata);
bt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,ReturnDataActivity.class); //定义intent但是不存储任何数据
startActivityForResult(intent,1);
//这里调用的不是常用的startActivity方法,而是可以获得下一个页面返回值的startActivityForResult方法
}
});
//传递数据给下一个页面
Button bt2=findViewById(R.id.bt_inputdata);
bt2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String data="This is a data from page1 to page2";
Intent intent=new Intent(MainActivity.this,GetDataActivity.class);
intent.putExtra("dataFromPage1",data); //插入数据,第一个参数是键,用来标明,第二个参数就是数据
startActivity(intent); //开启活动
}
});
}
//下一个页面销毁时会调用这个方法,也就可以通过这个方法获取后一个页面的返回值
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
//requestCode表示请求码,也就是startActivityForResult的第二个参数,用于标记作用
//data就是从下一个页面返回的intent对象
switch (requestCode){
case 1:
if(resultCode==RESULT_OK){
String returnData=data.getStringExtra("dataFromPage2"); //获取指定键的数据
Log.d("MainActivity",returnData); //打出日志信息
}
break;
default:
}
}
}
返回给主页面数据的页面
package com.example.activitytext;
import android.content.Intent;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import javax.xml.transform.Result;
public class ReturnDataActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_return_data);
Button bt1=findViewById(R.id.bt_returndata);
//绑定按钮事件
bt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent();
//定义一个空的intent用于返回数据
intent.putExtra("dataFromPage2","This is a data from page2");
//放入数据,第一个参数为键,用于标记,第二个参数就是数据本身
setResult(RESULT_OK,intent);
//将intent对象返回,第一个参数就是resultCode,有RESULT_OK,RESULT_CANCLE两种
finish();
//销毁页面
}
});
}
}
接收主页面数据的页面
package com.example.activitytext;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class GetDataActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_get_data);
Intent intent=getIntent();
//注意,这里一定是采用getIntent方法获取上一个页面传递过来的intent对象,否则无法正常获取数据
String data=intent.getStringExtra("dataFromPage1"); //String类型数据调用intent的getStringExtra方法
Log.d("MainActivity", data); //打印日志信息
}
}
活动的生命周期
返回栈
Android中的活动都是可重叠的,每启动一个新的活动就会覆盖在原来的活动上面,活动采用栈的存储方式,保持先进后出的原则,所以点击back返回键后,最后入栈的栈顶活动会被销毁,显示排在其后的一个活动
活动状态
每个活动在其生命周期内的四种可能状态
1. 运行状态:位于栈顶,正在运行,用户可见,系统最不愿意回收的活动
2. 暂停状态:不在栈顶,仍然可见,系统仍不愿意回收
3. 停止状态:不在栈顶,完全不可见,系统仍然会为其暂时保存相应活动状态和成员变量,但是当其他地方需要内存,系统就会回收处于暂停状态的活动
4. 销毁状态:一个活动从返回栈移除,系统最倾向于挥手的状态
活动的生存期
- onCreate():活动第一次被创建时调用,完成初始化操作(加载布局,绑定事件等)
- onStart():活动由不可见变为可见时调用
- onResume():当活动位于返回栈栈顶,处于运行状态,并且准备与用户进行交互时使用
- onPause():在准备启动或恢复另一个活动时调用
- onStop():活动完全不可见时调用
- onDestroy():活动被销毁前调用
- onRestart():活动由停止状态变为运行状态时调用
活动的生命周期图例
避免活动被回收
已经进入停止状态的活动,很容易由于内存不足原因被系统回收,所以默认情况下,当用户跳转到另一个页面后,按back返回原先界面时,并不是调用onRestart方法重启活动,而是调用onCreate方法重新创建一个活动,这样就可以避免后台回收原活动,返回后程序崩溃的问题发生。
但这样仍然存在一些问题,当我们按返回键返回原页面时,实际上是新创建了一个活动,那么这个活动原来的数据信息都会丢失,用户需要重新输入,为了避免这种情况发生,在返回重建页面时,能够保存这些已输入的数据,可以利用onSaveInstanceState
需要保存的活动重写onSaveInstanceState
@Override
public void onSaveInstanceState(@NonNull Bundle outState, @NonNull PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
String tempData="Somthing you just typed";
outState.putString("data_key",tempData);
}
修改onCreate方法使其重新创建时读取原先数据
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("onCreateTag","onCreate");
setContentView(R.layout.activity_main);
if(savedInstanceState!=null){
String temlDta=savedInstanceState.getString("data_key");
Log.d("onCreateTag",temlDta);
}
else{
......
}
}
活动的启动模式
standard
默认的启动模式,在不进行显式指定的情况下,所有活动都会自动采用这种启动模式
每次启动一个新活动都会将活动直接放入栈顶,并且不论栈中是否已经存在该活动,都选择新建一个活动
singleTop
检查栈顶,加入准备新建的活动与栈顶活动相同,则直接利用栈顶活动,否则创建新活动
singleTask
检查整个栈,如果存在与准备新建的活动相同的活动,就将这个活动之上的所有活动弹出栈内,保证这个活动位于栈顶
singleInstance
启用新的返回栈管理这个活动,方便信息共享