JackieMa's Blog

Come On!


  • Home

  • About

  • Tags

  • Categories

  • Archives

  • Search

如何使用hide掉的类及接口

Posted on 2019-03-24 | In Android | Visitors:

在做蓝牙电话的时候,发现有的类或者api是被 @hide 掉的,例如 BluetoothPbapClient.java 没法调用。
最正确的方法应该是自己修改定制源码,再编译使用。但是如果仅是测试用,可以继续考虑使用 hide 的类及接口,这里做个简单的总结。

不能访问的类或者接口

Android 有两种类型的 API 不能通过 SDK 访问。一种是在 com.android.internal 包中的 API(源码路径为framework/base/core/)。另一种是被标记为 @hide 属性的类和接口。

对于internal API来说,从来都没有计划将其开放出来。它就是Android的“内部厨房”,对开发者来说,应该将其视作黑盒。

Hidden API之所以被隐藏,是想阻止开发者使用SDK中那些未完成或不稳定的部分(接口或类),因为其可能会在后续的版本中被修改或者移除。

当使用 Android SDK 进行开发的时候,应用默认引用了 android.jar,它位于 sdk-platform-{android版本}-android.jar。SDK 中默认移除了所有的被@hide标识的接口或者类以及 internal 包下的类。

当应用在设备上运行时,它会加载 framework.jar。简单来说,framework.jar 和 android.jar 等同,但是没有移除 internal API 和 hidden API。

Read more »

蓝牙电话apk的实现及源码分析

Posted on 2019-03-20 | In Android | Visitors:

之前介绍了蓝牙基本功能实现(开启,扫描,配对,连接等), 在这里继续介绍蓝牙电话 apk 的实现,及相关源码的分析。

Read more »

Vultr 搭建 shadowsocks 教程

Posted on 2019-03-19 | In 工具 | Visitors:

连不了外网,上不了谷歌的感觉很不爽,咳咳,程序猿查资料而已。网上很多教程都被和谐了,生怕以后找不到教程,所以来这记录下。
仅供参考。
科学上网。

Read more »

mac 使用技巧归纳

Posted on 2019-03-17 | In 其他 | Visitors:

在家用 mac,总会有时候遇到快捷键与 windows 不同,或者其他的使用技巧,这里做个简单地归纳吧,方便自己的使用与查找。
时不时会做个更新。

Read more »

蓝牙基本功能实现(开启,扫描,配对,连接等)

Posted on 2019-03-16 | In Android | Visitors:

最近有在学习Android蓝牙模块功能,包括开启,扫描,配对,连接等,在这里记录下相关功能的实现。后续会再做蓝牙电话apk的实现及蓝牙相关源码的分享。

Read more »

反射机制原理及使用

Posted on 2019-03-15 | In Android | Visitors:

最近在研究蓝牙源码时发现,有部分类是被 @hide 掉的,例如 通过蓝牙获取通讯录及通话记录,是通过蓝牙 Pbap 协议,具体实现是在 BluetoothPbapClient 中实现,而该类是 hide 的,注释为当前未完成,后期变动可能会比较大,所以hide掉不会放在 sdk 里使用。
这种情况下,一般是通过修改源码重新编译来实现该需求,不过我为了快速完成需求,考虑使用反射来调用 BluetoothPbapClient 中的接口。
在此记录下反射的使用及原理。

反射,是能够在程序运行时修改程序的行为。

Read more »

CarRadioService 分析

Posted on 2019-03-04 | In Android源码 | Visitors:

CarRadioService 分析

需求需要自己做个车机版 Radio app,需要 framework 提供接口,并且需要定义在 CarService 中,所以这里对 CarService 的流程做了个简单地总结,以及如何在 framework 层定义接口,最后是在模拟器中如何调试接口。

Read more »

Fragment 详解

Posted on 2019-02-26 | In Android | Visitors:

Fragment 详解

前言

Fragment(碎片)功能,它非常类似于Activity,可以像Activity一样包含布局,Fragment通常是嵌套在Activity中使用的。
Activity一方面需要在布局中为Fragment安排位置,另一方面需要管理好Fragment的生命周期。Activity中有个FragmentManager,其内部维护fragment队列,以及fragment事务的回退栈。

Read more »

NavigationBar 分析

Posted on 2019-02-24 | In Android源码 | Visitors:

NavigationBar 分析

说明

Android手机可分为有导航栏以及没导航栏两种,一般有物理按键的机器不会带有导航栏,而没有物理按键的机器则基本会带。这里主要是分析导航栏导航栏的加载以及按键实现。

Read more »

BroadcastReceiver 静态注册与动态注册

Posted on 2019-02-21 | In Android | Visitors:

上篇文章提到了 使用自定义uri用于外部启动 app,而我们也可以使用广播来启动外部app,这篇文章简单的介绍下android广播的使用。

BroadcastReceiver 静态注册与动态注册

接收广播

1
2
3
4
5
6
7
8
9
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// UI 线程,不建议过多操作

// 注:启动Activity在这些类中是可以的,但是需要创建一个新的task。一般情况不推荐, 见Context 干货:(https://www.jianshu.com/p/881acfafd18d)
// activityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
}

静态注册

1
2
3
4
5
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="music"/>
</intent-filter>
</receiver>

动态注册

1
2
3
4
5
6
7
8
9
10
11
12
13
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

IntentFilter filter=new IntentFilter("music");
mBroadcast =new MyReceiver();
registerReceiver(mBroadcast,filter);
}

protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mBroadcast);
}

发送广播

1
2
3
4
Intent intent = new Intent("music");
// 8.0后,静态注册广播接收者时,需 setComponent()
intent.setComponent(new ComponentName("com.example.pvwav.broadcastreceiver", "com.example.pvwav.broadcastreceiver.MyReceiver"));
sendBroadcast(intent);
1234

Jackie Ma

小小, 小码农梦很美

35 posts
10 categories
52 tags
RSS
github
© 2020 Jackie Ma
Powered by Hexo
|
Theme — NexT.Mist v5.1.4