一、四大组件之Activity
1.AndroidManifest.xml
参考:https://blog.csdn.net/weixin_41729259/article/details/87910512?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.control
2.Activity之间跳转
问题:为什么需要显式和隐式两种意图?
回答:显式意图一般用于应用内组件跳转,隐式意图一般用于应用之间跳转,第三方应用的跳转。
2.1 显式意图
demo内容:模拟登陆,通过显式意图实现界面跳转,并将数据从一个页面传到另一个页面。
流程步骤:
第一步:创建一个Android项目, 当前项目中只包含一个Activity(MainActivity)
第二步:在第一个Activity的activity_main.xml中,编写登陆页面,包含账号输入、密码输入、登陆按钮。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<!--垂直排列:android:orientation="vertical"-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="账号:"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/account"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="密码:"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/password"
android:inputType="textPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/login"
android:text="立即登陆"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
第三步:创建第二个Activity页面,并在AndroidManifest.xml中注册第二个Activity页面。
?第四步:在第二个Activity的activity_second.xml中,编写第二个页面的内容,包含从第一个页面传来的数据。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_marginTop="20dp"
android:text="登陆信息如下:"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:layout_marginTop="20dp"
android:id="@+id/info"
android:text="您的登陆账号为:XXX,登陆密码为:***"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
?第五步:在第一个Activity页面中,获取View,并处理登陆逻辑。
package com.bytedance.marden;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private static final String TAG="MainActivity";
private EditText maccount;
private EditText mpassword;
private Button mlogin;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取View
initView();
//监听登陆按钮
initListener();
}
//监听登陆按钮,处理登陆逻辑
private void initListener() {
mlogin.setOnClickListener(new View.OnClickListener() {
@Override
//监听按钮点击事件
public void onClick(View v) {
//在日志中输出
Log.d(TAG,"登陆按钮被点击了");
//处理点击事件
handlerLogin();
}
});
}
//处理点击事件
private void handlerLogin() {
//判断账号是否合法
String accountText=maccount.getText().toString().trim();
if(TextUtils.isEmpty(accountText)){
Toast.makeText(this,"输入的账号为空",Toast.LENGTH_SHORT).show();
return;
}
//判断密码是否合法
String passwordText=mpassword.getText().toString().trim();
if(TextUtils.isEmpty(passwordText)){
Toast.makeText(this,"输入的密码为空",Toast.LENGTH_SHORT).show();
return;
}
//若账号密码均合法时,将数据传到另一个Activity页面
//创建意图对象,并通过startActivity方法跳转
Intent intent=new Intent(this,SecondActivity.class);
//将数据传入意图对象intent中
intent.putExtra("account",accountText);
intent.putExtra("password",passwordText);
startActivity(intent);
}
//获取View
private void initView(){
maccount=this.findViewById(R.id.account);
mpassword=this.findViewById(R.id.password);
mlogin=this.findViewById(R.id.login);
}
}
第六步:在第二个Activity页面,获取intent对象,并获取第一个Activity页面传入的数据
package com.bytedance.marden;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import androidx.annotation.Nullable;
public class SecondActivity extends Activity {
private static final String TAG="SecondActivity";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
//获取intent对象,并获取intent中的数据
Intent intent=getIntent();
String account=intent.getStringExtra("account");
String password=intent.getStringExtra("password");
//获取TextView,并将数据显示到TextView中
TextView info=this.findViewById(R.id.info);
info.setText("您的登陆账号为:"+account+" ,登陆密码为:"+password);
//打印日志
Log.d(TAG,"account=="+account);
Log.d(TAG,"password=="+password);
}
}
结果:
2.2 隐式意图
demo内容:模拟登陆,通过隐式意图实现界面跳转,并将数据从一个页面传到另一个页面。
流程步骤:
第一步:创建一个Android项目, 当前项目中只包含一个Activity(MainActivity)
第二步:在第一个Activity的activity_main.xml中,编写登陆页面,包含账号输入、密码输入、登陆按钮。
第三步:创建第二个Activity页面,并在AndroidManifest.xml中注册第二个Activity页面。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.bytedance.day20210714_demo2">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Day20210714_demo2">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.bytedance.SECOND_PAGE"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
</application>
</manifest>
?第四步:在第二个Activity的activity_second.xml中,编写第二个页面的内容,包含从第一个页面传来的数据。
?第五步:在第一个Activity页面中,获取View,并处理登陆逻辑。
第六步:在第二个Activity页面,获取intent对象,并获取第一个Activity页面传入的数据
结果:
2.3 显式意图跳转第三方应用
第一步:创建 Android应用,在主Activity的布局中,设置一个点击按钮。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/skip"
android:layout_marginTop="300dp"
android:text="点我跳转到浏览器"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
第二步:在主Activity中,监听按钮点击事件,并添加处理点击事件的逻辑。
说明:通过显式意图进行第三方应用的跳转,需要知道第三方应用的软件包名称或完全限定的组件类名。
package com.bytedance.day20210715_demo2;
import androidx.appcompat.app.AppCompatActivity;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initListener();
}
//按钮监听
private void initListener() {
//获取主Activity中的Button
Button button =this.findViewById(R.id.skip);
//为Button添加点击监听
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//点击事件处理逻辑
handleListener();
}
});
}
//点击事件处理逻辑
private void handleListener() {
Intent intent = new Intent();
//第一种写法
// intent.setClassName("com.android.browser","com.android.browser.BrowserActivity");
//第二种写法
ComponentName componentName = new ComponentName("com.android.browser","com.android.browser.BrowserActivity");
intent.setComponent(componentName);
startActivity(intent);
}
}
?结果:
2.4 隐式意图跳转第三方应用
第一步:创建 Android应用,在主Activity的布局中,设置一个点击按钮。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/skip"
android:text="点我跳转到浏览器(隐式意图)"
android:layout_marginTop="300dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
第二步:在主Activity中,监听按钮点击事件,并添加处理点击事件的逻辑。
说明:通过隐式意图进行第三方应用的跳转,需要为Intent对象设置action值,category值,以及包名(系统5.1版本以上)。
package com.bytedance.day20210715_demo3;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//监听按钮点击事件
initListener();
}
//监听按钮点击事件
private void initListener() {
Button button = this.findViewById(R.id.skip);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
handleListener();
}
});
}
//按钮点击事件的处理逻辑---跳转到浏览器
private void handleListener() {
//1.创建Intent对象
//2.为Intent对象设置action值,actegory值以及包名(5.1系统以上需要设置包名)
//3.通过startActivity方法跳转到另一个界面
Intent intent = new Intent();
intent.setAction("android.intent.action.SEARCH");
intent.addCategory("android.intent.category.DEFAULT");
intent.setPackage("com.android.browser");
startActivity(intent);
}
}
?结果:
|