我想在一个活动中启动另一个活动怎么做?
-
开篇抛出这个问题,因为我们在日常使用app总会遇到如下场景:在QQ中点开一个文件,选择用其他应用打开,然后系统弹框,提示是使用QQ浏览器打开还是用WPS打开(假设我们下载了WPS)?如下:
用何种方式打开 - 那我们如何解决这个问题呢,也就是在多个活动之间穿梭。毫无疑问,我们需要Intent这个类。
Intent
- 当我们想要启动一个Activity时,调用startActivity()方法。启动一个Activity有两种方法:
- 显式启动:需要指定准备启动的Activity。
- 隐式启动:隐式启动不需要指定特定的Activity,只需要指定Intent指定对应的category(类别)、action(动作)、data(数据)即可,具体启动哪一个Activity由系统和用户共同来决定。启动的Activity可以是系统中自带的,也可以是已安装的第三方程序中的Activity。
- 显式启动的方式:
Intent intent = new Intent(A.this,B.class);//A代表主活动,B代表要启动的活动
StartActivity(intent);//跳转到第二个活动
- 隐式启动的方式:
Intent it = new Intent(Intent.ACTION_DIAL);//.ACTION_DIAL指明启动动作
it.setData(Uri.parse(“tel:13550093021”));//调用setData()方法,设置数据
StartActivity(it);//启动并跳转到第二个活动
补充:
- ACTION_DIAL显示打电话面板。
- 通过Uri.parse()方法将电话号码解析成一个Uri对象,再通过setData()方法将这个Uri对象传进去。
- 接下来介绍如何利用显式启动来开发一个简易倒计时器。
实现简易倒计时器
- 准备完成的功能:
- 设置一个主活动,主活动中提供用户输入倒计时的具体数值,点击倒计时按钮,页面跳转到第二个活动。
- 在一个Button控件中显示倒计时的具体过程。
-
编写设置倒计时的页面,显示效果如下,代码在最后给出。
设置倒计时数数值 - 编写主活动页面,将在EditText控件里面获取的数值通过Intent的putExtra()方法传递到第二个活动中。代码如下:
public class MainActivity extends AppCompatActivity {
Button button;
EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText)findViewById(R.id.edit1);
button = (Button)findViewById(R.id.button1);
}
public void Start(View view) {
String data = editText.getText().toString();
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("extra_data", data);
startActivity(intent);
}
}
补充:
-
public void Start(View view)
是点击按钮后要实现的操作。在创建Intent对象后,通过putExtra()方法传递数据,其方法接收两个参数,第一个是键,第二个才是要传递的参数。
- 既然传递了数据,我们就要接收数据,并实现倒计时的方法。代码如下:
public class SecondActivity extends AppCompatActivity {
Button button;
TextView textView;
Integer integer = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
long num = (long) integer.parseInt(data);
textView = (TextView)findViewById(R.id.sectext1);
button = (Button)findViewById(R.id.secbutton1);
CountDownTimer timer = new CountDownTimer(num * 1000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
button.setText("还剩" + millisUntilFinished / 1000 + "秒");
}
@Override
public void onFinish() {
button.setText("倒计时完毕");
}
};
timer.start();
}
补充:
-
Intent intent = getIntent()
这里使用getIntent()方法检索此Item中包含的原始Intent,并将此Intent赋值给一个intent变量。 -
String data = intent.getStringExtra("extra_data")
getStringExtra()方法传入第一个活动中定义的键,获得相应的数据并存放到data变量中。 -
long num = (long) integer.parseInt(data)
因为后面要使用的数据类型是long型,但我们这里传递进来的数据类型的String型,所以我们使用Integer类中parseInt()方法将data转换为Int型再强制转换成long型。 -
CountDownTimer timer = new CountDownTimer(num * 1000, 1000)
这里我们使用了CountDownTimer这个类来实现倒计时的功能。括号里第一个参数传入倒计时的总时间(毫秒为单位,所以我们需要乘以1000化为秒);第二个参数传入每次减去的时间(毫秒为单位,这里每次减去1s)。 -
public void onTick(long millisUntilFinished)
此函数的功能从传入参数的英文意思可知,传入倒计时结束的总毫秒数。然后调用button.setText()方法将倒计时提示传到按钮框中。 -
public void onFinish()
倒计时结束后执行此方法,在按钮控件中显示倒计时完毕提示。 -
timer.start()
只有调用了start()方法,倒计时的功能才能实现。
- 第二个活动的布局代码后面给出。
实际效果
-
主活动,输入倒计时数值
倒计时设置页面 -
点击第一个活动按钮跳转到倒计时具体页面
倒计时
GitHub地址
- 主活动代码
https://github.com/0xmxhnc/AndroidTest/blob/master/TimeDemo/app/src/main/java/com/example/timedemo/MainActivity.java - 活动二代码
https://github.com/0xmxhnc/AndroidTest/blob/master/TimeDemo/app/src/main/java/com/example/timedemo/SecondActivity.java - 主活动布局代码
https://github.com/0xmxhnc/AndroidTest/blob/master/TimeDemo/app/src/main/res/layout/activity_main.xml - 活动二布局代码
https://github.com/0xmxhnc/AndroidTest/blob/master/TimeDemo/app/src/main/res/layout/activity_second.xml
网友评论