1. 显式意图与隐式意图的区别:
显式意图:显式意图明确指明了启动活动的上下文和想要启动的目标活动,显式意图明确指定了Intent应该传递给哪个组件。
隐式意图:没有明确指定组件名的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。
开启自己应用的界面用显式意图,开启其他应用(一般指系统应用)的时候用隐式意图(比如拨打电话)。
显式意图安全一些,隐式意图可以通过匹配intent-filter里面的标签对应来跳转到相应的页面 。
————————————————
版权声明:本文为CSDN博主「砖业洋__」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34115899/article/details/81633077
2. 隐式意图的使用:
MainActivity:
1 package com.example.activitydemo; 2 3 import androidx.appcompat.app.AppCompatActivity; 4 5 import android.content.Intent; 6 import android.os.Bundle; 7 import android.os.Handler; 8 import android.text.TextUtils; 9 import android.util.Log; 10 import android.view.View; 11 import android.widget.Button; 12 import android.widget.EditText; 13 import android.widget.Toast; 14 15 /** 16 * 实现页面的跳转并且把数据传给另外一个界面 17 */ 18 19 public class MainActivity extends AppCompatActivity { 20 21 private static final String TAG = "MainActivity"; 22 private EditText mUsername; 23 private EditText mPassword; 24 private Button mLogin; 25 26 @Override 27 protected void onCreate(Bundle savedInstanceState) { 28 super.onCreate(savedInstanceState); 29 setContentView(R.layout.activity_main); 30 31 // 初始化控件 32 initView(); 33 34 // 设置监听事件 35 initListener(); 36 } 37 38 private void initListener() { 39 mLogin.setOnClickListener(new View.OnClickListener() { 40 @Override 41 public void onClick(View v) { 42 // 创建专属于login按钮的事件 43 Log.d(TAG, "Login clicked"); 44 45 // 分开写函数的原因在于,执行一段内容后使用return结束,不影响下文的执行 46 handlerLogin(); 47 48 Log.d(TAG, "下文被执行"); 49 50 } 51 }); 52 } 53 54 private void handlerLogin() { 55 String usernameText = mUsername.getText().toString().trim(); 56 if (TextUtils.isEmpty(usernameText)) { 57 // 在手机的最底下弹出提示 58 Toast.makeText(this, "输入的账号为空!", Toast.LENGTH_SHORT).show(); 59 return; 60 } 61 62 String passwordText = mPassword.getText().toString().trim(); 63 if (TextUtils.isEmpty(passwordText)) { 64 Toast.makeText(this, "输入的密码为空!", Toast.LENGTH_SHORT).show(); 65 return; 66 } 67 68 // 有密码有账号以后,把数据传到另外一个界面 69 // 创建一个意图对象,通过startActivity方法实现跳转 70 /** 71 * 显示意图启动与跳转 72 */ 73 // // 这里指定了特定了组件 74 // Intent intent = new Intent(this, SecondaryActivity.class); 75 // // 通过类似键值对进行数据传输 76 // intent.putExtra("username", usernameText); 77 // intent.putExtra("password", passwordText); 78 // startActivity(intent); 79 80 /** 81 * 使用隐式意图跳转到第三个界面,没有指定特定的组件 82 */ 83 Intent intent = new Intent(); 84 // 在Manifest中注册过意图过滤器后,设定action 85 intent.setAction("com.example.LOGIN_INFO"); 86 // intent.addCategory("android.intent.category.DEFAULT"); 87 // 或者写成,一般优先使用常量,而且自己设定的也尽量设为常量 88 intent.addCategory(Intent.CATEGORY_DEFAULT); 89 intent.putExtra("username", usernameText); 90 intent.putExtra("password", passwordText); 91 startActivity(intent); 92 } 93 94 private void initView() { 95 mUsername = this.findViewById(R.id.username); 96 mPassword = this.findViewById(R.id.password); 97 mLogin = this.findViewById(R.id.login); 98 } 99 }
跳转到的第三个界面ThirdActivity:
1 package com.example.activitydemo; 2 3 import android.app.Activity; 4 import android.content.Intent; 5 import android.os.Bundle; 6 import android.util.Log; 7 import android.widget.TextView; 8 9 import androidx.annotation.Nullable; 10 11 /** 12 * 通过隐式意图跳转到该界面 13 */ 14 public class ThirdActivity extends Activity { 15 16 private static final String TAG = "ThirdActivity"; 17 18 @Override 19 protected void onCreate(@Nullable Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 setContentView(R.layout.activity_second); 22 23 TextView info = this.findViewById(R.id.info); 24 25 // 首先初始化 26 Intent intent = getIntent(); 27 // 通过键取值 28 String username = intent.getStringExtra("username"); 29 String password = intent.getStringExtra("password"); 30 31 Log.d(TAG, "username == " + username); 32 Log.d(TAG, "password == " + password); 33 34 // 也可以用占位符写 35 info.setText("您的账号:"+ username + "; 密码:" + password); 36 } 37 }