Web前端最新Android进阶(二十九) 走近 IntentFilter,Web前端后端社招面试经历

最后

整理面试题,不是让大家去只刷面试题,而是熟悉目前实际面试中常见的考察方式和知识点,做到心中有数,也可以用来自查及完善知识体系。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

《前端基础面试题》,《前端校招面试题精编解析大全》,《前端面试题宝典》,《前端面试题:常用算法》

前端面试题宝典

前端校招面试题详解

当前APP启动另外一个目标APP(非覆盖原来APP的方式),可以按照如下方案实施:

3.1.1 系统包管理器方式
  1. 当前APP加入获取权限声明:(不加入权限检查,没法启动目标app)
 <uses-permission android:name="android.permission.QUERY\_ALL\_PACKAGES"
 tools:ignore="QueryAllPackagesPermission" />
 <uses-permission android:name="android.permission.LAUNCH\_APP" />

  1. 执行APP跳转
String packageName = "com.target.package"; // 目标应用的包名
PackageManager packageManager = getPackageManager();
Intent intent=new Intent();
intent = packageManager.getLaunchIntentForPackage(packageName);
 if(intent==null){
     Toast.makeText(MainActivity.this, "未安装", Toast.LENGTH\_LONG).show();
 }else{
     startActivity(intent);
 }

  1. 目标APP处理
@Override
protected void onCreate(Bundle savedInstanceState) {
  	requestWindowFeature(Window.FEATURE\_NO\_TITLE);
  	initWindows(this);
  	super.onCreate(savedInstanceState);
	Intent intent = getIntent();
	if (intent != null && intent.hasExtra("message")) {
	  String message = intent.getStringExtra("message");
	  IntentModule.message = message;
	  IntentModule.getMessage();
	}   
}

3.1.2 Intent隐式调起方式

当前APP做如下处理:

Intent intent2 = new Intent();
intent2.setAction("定义的action,要与后面B中使用的保持一致");
intent2.putExtra("data","传递的数据");
startActivity(intent2);

目标APP AndroidManifest.xml配置文件做如下处理:

<activity android:name="要跳转的指定类">
    <intent-filter>
        <action android:name="定义的action,要与前面A中的保持一致"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

目标APP参数处理逻辑如下:

Intent intent = this.getIntent();
if(null != intent.getStringExtra("data")){
    //处理数据
}

3.1.3 通过 ComponentName 类实现

当前APP做如下处理:

Intent intent1 = new Intent();
ComponentName name = new ComponentName("应用B的包名","应用B中跳转到的activity的全路径");
intent1.setComponent(name);
intent1.putExtra("data","传递的数据");
startActivity(intent1);

目标APP AndroidManifest.xml配置文件对应的Activity下添加 android:exported="true" 表示允许其它应用调用当前组件;

目标APP参数处理逻辑如下:

Intent intent=this.getIntent();
if(null != intent.getStringExtra("data")){
    //处理数据
}

3.2 从一个APP跳转到另外一个目标APP,并传参
  1. 执行APP AndroidManifest.xml 设置。
android:exported="true"

  1. 执行APP跳转
Intent intent = new Intent(Intent.ACTION\_MAIN);
/\*\*知道要跳转应用的包命与目标Activity\*/
ComponentName componentName = new ComponentName("com.demo.demo", "com.demo.ui.main.DemoActivity");
intent.setComponent(componentName);
intent.putExtra("salesNo", "参数1");
intent.putExtra("code", "参数2");
startActivity(intent);

  1. 目标APP AndroidManifest.xml 设置。
android:exported="true"
android:launchMode="singleInstance"

  1. 目标APP在 onCreate 方法中接收传值:
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
String salesNo = "";
String code = "";
if (bundle != null) {
    salesNo = bundle.getString("salesNo");
    code = bundle.getString("code");
}

3.2.1 为什么 intent.getStringExtra() 总是返回 null ?

实操过程中,有的同学可能会遇到应用intent.getStringExtra()返回null的情形。出现返回null的原因可能有以下几种:

  1. 没有正确设置Intent传递的数据

可能使用putExtra方法将数据存放到Intent中,而接收方在处理数据时没有正确取出来。也有可能是Intent中并没有存放所需要的数据。

  1. 在使用intent.getStringExtra()之前没有使用intent.hasExtra()检查是否存在所需的值。

在使用getStringExtra()方法之前,应该先通过hasExtra()方法检查是否存在所需的值。没有检查是否存在这个值时,就可能会出现返回null的情况。

  1. 使用键值不正确

在从Intent中取出数据时,需要用到getStringExtra()方法的参数键值(key),而有可能使用了错误的键值。需要确保键值正确,才能从Intent中正确取出所需的数据。

  1. 数据类型不匹配

在存放数据时,使用了一个错误的数据类型。当使用getStringExtra()方法去取出时,就会出现返回null的情况。需要检查所存放的数据的类型是否与要取出的类型一致。

3.2.2 Intent 对象被重用

多次使用同一个PendingIntent发送广播时,可能会出现Intent对象被重用的情况,导致获取到的数据不正确。

要解决这个问题,可以在创建PendingIntent时,使用PendingIntent.FLAG_UPDATE_CURRENT标志来更新当前的Intent,确保每次发送广播时都是使用新的Intent对象。示例如下:

// 创建Intent对象
Intent intent = new Intent(context, MyReceiver.class);
intent.putExtra("data", "hello world");
 
// 创建PendingIntent对象,并同时指定FLAG\_UPDATE\_CURRENT和FLAG\_IMMUTABLE标志
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG\_UPDATE\_CURRENT | PendingIntent.FLAG\_IMMUTABLE);
 
// 发送广播
pendingIntent.send();

重点是:PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE

3.3 从当前APP跳转到另外一个目标APP的某个页面

由当前APP启动另外一个目标APP(非覆盖原来APP的方式)某个指定页面时,可以按照如下方案实施:

  1. 目标APP对应Activity中加入如下action:
 <activity
 android:name="com.xxx.package.TargetXXActivity"
 android:exported="true">
     <intent-filter>
       <action android:name="jp" />  <!--标志-->
       <category android:name="android.intent.category.DEFAULT" />  <!--这是一个普通页面-->
      </intent-filter>
 </activity>

  1. 当前应用APP执行跳转到目标APP页面。
 Intent intent = new Intent("jp");  // 标志(要和目标APP的清单文件中的标志一样)
 startActivity(intent);

注⚠️:Intent 跳转时须捕获一下异常,防止目标对象不存在引起崩溃。

最后

除了简历做到位,面试题也必不可少,整理了些题目,前面有117道汇总的面试到的题目,后面包括了HTML、CSS、JS、ES6、vue、微信小程序、项目类问题、笔试编程类题等专题。

、笔试编程类题等专题。

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值