Intent 是一个消息传递对象
<intent-filter> : Activity的名片
软件安装在手机,手机里的数据库,现在推荐使用LitePal数据库
// 发送消息给符合条件的Activity
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND); //要干嘛
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage); //带信息
sendIntent.setType("text/plain"); //类型
// Verify that至少有一个应用能够处理该 Intent
if (sendIntent.resolveActivity(getPackageManager()) != null) {
startActivity(sendIntent);
}
//通过Intent意图,实现Activity之间的跳转
startActivity(new Intent(this,BActivity.class));
//启动该服务, 例如,如果在应用中构建了一个名为 DownloadService、旨在从网页下载文件的服务,则可使用以下代码:
Intent downloadIntent = new Intent(this, DownloadService.class);
downloadIntent.setData(Uri.parse(fileUrl));
startService(downloadIntent);
//获取系统服务,从而获取网络\音量\wifi 等信息
getApplicationContext().getSystemService(NOTIFICATION_SERVICE); //返回NotificationManager对象(按类将句柄返回到系统级服务)
//存取文件
getFilesDir();
getCacheDir();
getDir("名字",MODE_PRIVATE); //私有数据,可覆盖
//发送:消息装进Intent,调用
sendBroadcast(new Intent().putExtra("name", "value"));
//接收:
new BroadcastReceiver().onReceive(this,intentRecieved); //只活10s,要做事交别人
后台Service是依赖于应用程序的主线程的,不建议在Service中编写耗时操作,否则会引起ANR。
那么我们当我们编写的耗时逻辑,不得不被service来管理的时候,就需要引入IntentService
IntentService在执行onCreate操作的时候,内部开了一个线程,去你执行你的耗时操作。
在消息被handler接受并且回调的时候,执行了重写的onHandlerIntent方法
public class MyService extends Service {
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
}
Fragment:是一个布局标签<Fragment>,用于组成一个 Activity
在Activity的Created后, 会调用Fragment的onAtt(), onCreateView()等方法
Fragment可以getActivity() 获取所在的Activity
交换数据:eView()等方法
Fragment可以getActivity() 获取所在的Activity
交换数据:
Activity中 Fragment.setArgument(new Buddle().putString()) //存数据
Fragment中 getArguments().get(); //取数据
Intent.putExtra(ID, UUID); //存id进intent
UUID=(UUID)getIntent().getSerializableExtra(ID); //取intent的id
Fragment.setArguments(Bundle.putSerializable(ID,UUID)) //把id设为Fragment参数
UUID = (UUID) getArguments().getSerializable(ID); //取Fragment参数为id
工厂.生产车间.getSomethingByID(UUID ); //根据id创建东西
AIDL(Android 接口定义语言) 您可以利用它定义客户端与服务使用进程间通信 (IPC) 进行相互通信时都认可的编程接口。
只有允许不同应用的客户端用 IPC 方式访问服务,并且想要在服务中处理多线程时,才有必要使用 AIDL。
绑定服务是客户端-服务器接口中的服务器。
eg:。后台播放音乐Service,通知栏界面上有上一曲,下一曲、暂停、播放等按钮,通过这些按钮还可以控制Service操作,这种情景就是使用的绑定
不同的 Android 手机使用不同的 CPU,进而支持不同的指令集。 CPU 与指令集的每种组合都有专属的应用二进制界面,即 ABI:
机器代码应使用的 CPU 指令集。
运行时内存存储和加载的字节顺序。
可执行二进制文件(例如程序和共享库)的格式,以及其支持的内容类型。
用于在代码与系统之间传递数据的各种约定。 这些约定包括对齐限制,以及系统调用函数时如何使用堆栈和寄存器。
运行时可用于机器代码的函数符号列表,通常来自非常具体的库集。
ABI 支持的指令集 备注
armeabi ARMV5TE 和更高版本Thumb-1 在 r16 中已弃用。在 r17 中已移除。无硬浮点。 此 ABI 适用于基于 ARM 且至少支持 ARMv5TE 指令集的 CPU。
armeabi-v7a armeabiThumb-2VFPv3-D16其他(可选) 与 ARMv5、v6 设备不兼容。 此 ABI 可扩展 armeabi 以包括多个 CPU 指令集扩展
arm64-v8a AArch64 此 ABI 适用于基于 ARMv8 且支持 AArch64 的 CPU
x86 x86 (IA-32)MMXSSE/2/3SSSE3 不支持 MOVBE 或 SSE4。 此 ABI 适用于支持通常称为“x86”或“IA-32”的指令集的 CPU
x86_64 x86-64MMXSSE/2/3SSSE3SSE4.1、4.2POPCNT 此 ABI 适用于支持通常称为“x86-64”的指令集的 CPU
注:NDK 以前曾支持 32 位和 64 位 MIPS,但这项支持已在 NDK r17 中移除。
从厂家上来分是有三种,arm,x86,MIPS #arm 系列是绝大多数手机上使用的,x86 主要是运用在平板上,而 MIPS 基本上就没见过。
名字中没有64的就是32位的了。
正常来说只使用 armeabi-v7a 就可以适配基本所有手机了,因为现在手机基本上都支持这种CPU架构
arm64-v8a 的 CPU 架构上也能运行 armeabi-v7a, arm64-v8a 上本身搭载了 armeabi-v7a
amd64(跟x86_64是一个东西,amd开发的,因特尔用了它给它起了自己的名字)
x86(i386,i586.奔腾,大家都习惯叫因特尔的处理器叫x86系列,即使它是64位的)
如果应用中有不止一个 so,那就要注意了,如果这时你一个 so 同时支持了 armeabi-v7a 和arm64-v8a
而另一个 so 只支持了一种,那可能会运行有问题,这时要么另一个 so 也支持两种,要么把第一个 so 删掉对应目录,只支持相同的一种。
//在提供支持多个 CPU 架构的 SDK 时,可以同时提供多个目录的 so,虽然此时 SDK 相对较大,但是被编译的 so 还是以你在 gradle 里设置的支持的 ndk 为准:
ndk {
abiFilters ‘armeabi-v7a’ // , ‘arm64-v8a’, ‘x86’, ‘x86_64’
} //查看设备支持的 CPU 架构或者 APP 提供的 CPU 架构可以使用 Native Libs Monitor。
//先在你的 oldActivity 中
startActitivyForResult(newActivity);
//newActivity 返回的时候就回到了你原来的 oldActivity 中调用 onActivityResult() 了
//MainActivity
extends AppCompatActivity(android.support.v7.app)
extends FragmentActivity extends SupportActivity(android.support.v4.app)
extends Activity extends ContextThemeWrapper extends ContextWrapper extends Context(android.app)