【济南中心】Android课程同步笔记day01:Android应用之安全卫士

合集下载

黑马程序员android开发笔记及源码

黑马程序员android开发笔记及源码

01、什么是3G02、android系统简介03、android背景介绍04、android的framewor简介05、两种虚拟机的比较06、sdk的下载以及简介07、创建android模拟器08、ddms简介09、platform-tools的简介及常见adb指令10、android项目的目录结构11、android下apk安装的过程12、常见的adb指令介绍13、创建模拟器遇到的常见错误14、电话拨号器15、点击事件的四种写法16、短信发送器17、相对布局&单位介绍18、现形布局&布局的组合19、表格布局&绝对布局20、帧布局21、测试相关概念22、android下junit测试框架配置23、logcat简介24、保存文件到手机内存25、android下文件访问的权限26、保存文件到SD卡中27、分析setting源代码获取SD卡大小28、_sharePreference入门29、xml文件的序列化30、采用pull解析xml文件31、采用断电调试的方法观察pull解析的的流程32、android下创建一个sqllite数据库33、sql语句实现数据库的增删改查34、系统api实现数据库的增删改查&Sqlite3工具的使用35、数据库的事物36、listView入门37、采用layoutInflater打气筒创建一个view对象38、采用数据适配器ArryAdapter39、常用数据适配器simpleAdapter40、数据适配器总结41、内容提供者简介42、内容提供者的实现43、短信的备份44、插入一条记录到系统短信应用45、内容观察者46、获取系统的联系人信息47、保存联系人到系统通讯录48、读取联系人的一个小细节49、网络图片查看器50、anr产生的原理&如何避免51、android消息机制入门52、网络html查看器53、字符乱码问题的处理54、采用get方式提交数据到服务器55、采用post方式提交数据到服务器56、提交数据到服务器中文乱码问题的处理57、采用httpclient提交数据到服务器58、异步http框架简介&实现原理59、异步http框架提交数据到服务器60、上传文件到服务器61、smartimageview&常见开源代码62、多线程下载的原理63、多线程断点下载的原理64、多线程java代码移植到android65、多线程下载文本页面的更新66、显示意图激活另一个activity67、隐式意图激活另一个activity68、隐式意图的配置69、隐式意图和显示意图的使用场景70、在不同activity之间数据传递71、activity的声明周期72、activity的启动模式73、activity横竖屏切换的声明周期74、开启新的activity获取他的返回值75、请求码和结果码的作用76、利用广播实现ip拨号77、短信窃听器78、自定义广播时间&发送自定义广播&广播接受者优先级79、采用服务执行长期后台操作80、采用服务窃听电话&服务的声明周期81、android进程优先级&为什么使用服务82、绑定方式开启服务&调用服务的方法83、服务的声明周期(混合开启84、采用aidl绑定远程服务85、代码注册广播接受者&利用广播调用服务的办法86、加载大图片到内存87、获取图片exif信息88、从gallery获取图片89、图片画画板90、扒开美女衣服91、图片的缩放92、图片的旋转93、图片的平移&镜面&倒影效果94、图片的合成95、图片的颜色处理96、多媒体播放api简介97、人脸识别98、mediaplayer的生命周期99、soundpoo简介100、sufaceview的生命周期101、播放在线视频102、视频播放器进度的处理103、调用系统照相机拍照和录像104、采用camera拍照105、常见对话框106、notification入门107、菜单108、android下的样式109、android下的主题110、代码编写ui111、html创建ui112、帧动画113、代码创建创建的tween动画114、xml文件定义动画115、传感器简介116、117、杀死进程118、apk的安装119、应用程序的反编译120、动态创建fragment121、用fragment创建一个选项卡122、fragment的向下兼容性123、fragment的生命周期124、fragment之间的通讯125、应用程序国际化04、android的framewor简介Wap:wait and playWireless Makeup Language(WML)精简的html语言Applications:android自带的基本上层应用Aplication framework:应用程序框架Librarics:Linux lernel:05、两种虚拟机的比较编译后文件格式:jvm:.java->.class->.jardalvik vm:.java->.dex->.odex基于的架构:jvm:基于栈的架构dalvik vm:基于寄存器的架构Cpu直接访问寄存器因此dalvik虚拟机的效率比jvm高06、sdk的下载以及简介->获取sdk工具包(sdk:standard develope kits)->ADT(android develop tools,实际上是eclipse的插件)SDK具体内容Android->SDK Plateform:开发时使用到的jar包->Samples for sdk:->ARM EABI V7a System Image:模拟器运行时的镜像->Intel n86 Aton System:模拟器运行时的镜像->MIPS System Image:模拟器运行时的镜像->google APIs:google提供的jar包,可以直接使用google提供的一些API ->source for android SDK:SDK全部的源代码Extrals:->tools:开发的工具->support library:实现高版本的android向下的兼容->google Admed Ads SDK:gongle提供的广告插件->Analyties App Irackiong SDK:应用的用户分析->cloud message:云消息->gongle play service:收费服务->google USB Driver:真实的设备驱动开发时:基于4.0,兼容2.2、2.3.307、创建android模拟器avd:android virture developerVGA:480*640(电视的标准分辨率)QVGA:240*320(四分之一)HVGA:320*480(一半)WVGA:480*800(width)FWVGA:480*854(更宽)08、ddms简介ddms:模拟器不支持中文,因此发送中文会显示不出来09、platform-tools的简介及常见adb指令Android调试桥:内部实现就是socket让两个系统之间实现数据交互->reset adb:模拟器找不到时候可以重启->adb device:列出所有的连接的设备->adb kill-server:杀死adb调试桥->adb start-server 启动adb调试桥dx.bat:将.class文件打包10、android项目的目录结构一:SDK的目录结构->Samples->Api demo:根据API demo(模拟器上面可以看见)的效果可以在sample中看见相应的代码->Source:jar包所有的sdk源代码都在这个文件夹里->SystemImage:系统镜像->temp:下载更新临时存储的文件夹,一般是空的->tools:emulater.ext 不同版本的模拟器二:New Android Application->theme:留给以后作为扩展,现在并没有太大的作用->target SDK:一般选择高版本,因为高版本对下兼容->mark project as a library:一般不选择,意思是将这个项目提供一个jar包供别人使用三:文件夹目录.setting:设置目录assets:资产目录,存放一些文件,这些文件会被原封不动打包到应用程序的apk中bin:gen:自动生成的目录->builderConfig.java:生成的配置信息->R.java:Android 4.1.2->android.jar开发环境,jar包可以在properties中修改,jar包就是SDK011、Android下apk的安装过程一、Android安装过程分析:->setContentView:甚至view的对象,把里面的xml文件加载到->在project中选择build automaticly会自动把文件生成字节码文件,.class $代表的class文件生成的是内部类->dex.bat文件会把.class文件生成.dex文件->apk压缩文件解压内部内容->META-INF:应用程序的签名eclipse的调试签名文件->res:资源文件->classes.dex:class文件->resources.arsc:资源ID映射->android软件安装的过程:->拷贝xxx.apk带/data/app/xxx-1.apk->在/data/data目录下创建一个文件夹,文件夹名称当前应用程序的报名012、常见adb指令前提:->设备连接上电脑而且驱动安装正常,如果安装不正常的话,会有黄色的问号显示;->设备上打开USB调试;指令:->adb device(如果启动发现这个程序没有安装会自动安装)->adb kill-server->adb start-server->adb uninstall <包名>->adb -s emulator-5554 install c:\\users\\administrator\\hello.apk如果有多个设备的话,如果不指定安装的是哪个设备程序会报错->adb push haha.prop /sdcard/haha.txt 将文件移到(360管家,豌豆荚之类的软件他们也是用的adb指令,倘若电脑上装这些软件的话,会因为两个adb指令抢端口号而挂掉)(adb版本之间兼容不是很好,经常报错可以考虑下版本的问题)->adb shell:远程连接到了android的linux终端ls:显示文件夹ps:显示正在运行的程序ping:网络连通性013、创建模拟器遇到的常见错误->路径最好不要有中文:->应用安装不上,或者安装模拟器的时候开启一个新的模拟器:可能是模拟器的资源被占用,模拟器在运行的时候其实占用着硬盘上面的一个文件,这个文件位于工作空间.android/avd/iphone.avd 里面会有镜像文件,当一个模拟器开启起来了,就给你创建一个文件夹.knock的文件夹,代表着这个模拟器被锁定了,如果把模拟器关掉,就没有程序占据这几个镜像资源了,那么这几个程序就会被自动删除。

【济南中心】Android课程同步笔记day12:Android应用之安全卫士

【济南中心】Android课程同步笔记day12:Android应用之安全卫士

Android课程同步笔记day12:Android应用之安全卫士程序锁程序锁可以将某一个应用上锁,当进入该程序时需要输入手机防盗密码,UI界面如图所示在程序锁界面中使用Fragment 控件分别展示未加锁应用和已加锁应用,将一个应用加锁后,此时会将该应用存入到数据库中。

当在常用工具界面中打开程序锁服务时,运行在后台的服务监测当前打开的应用,如果打开的应用在数据库中,就说明程序是加锁程序,会弹出输入密码界面,密码输入正确后才能打开应用(密码为手机防盗密码)。

看门狗看门狗服务顾名思义就是替用户监测手机中的一些信息,这里的看门狗主要是为上面的程序锁功能服务的,它可以在用户点击加锁应用时进入一个输入密码的界面,只有输入密码正确才会进入当前应用中,效果图如图所示:密码设置和输入界面上诉功能中只要我们选择某一个应用添加到加锁界面后,并且我们打开了看门狗服务,那么当点击这个应用时就应该输入密码;这里设置密码和输入密码的界面如下图所示;并且在设置密码之前还有一个设置向导的界面程序锁密码页面结构根据我们的页面结构图分析来看,首先进入程序锁界面应该判断是否是需要输入密码还是设置密码:public class AppLockSettingActivity extends FragmentActivity {private static final String TAG = "AppLockSettingActivity";private TextView mTvTitle;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_app_lock_setting);mTvTitle = (TextView) findViewById(R.id.als_tv_title);// 要么显示密码输入,要么显示密码设置// 有密码--》密码输入// 没有密码--》密码设置String pwd = PreferenceUtils.getString(this, Config.KEY_APP_LOCK_PWD);if (TextUtils.isEmpty(pwd)) {// 密码设置loadPwdManagerFragment();} else {// 密码输入loadPwEnterFragment();}}* 进入密码设置界面*/private void loadPwdManagerFragment() {Log.d(TAG, "进入密码设置");FragmentManager fm = getSupportFragmentManager();FragmentTransaction transaction = fm.beginTransaction();transaction.replace(R.id.als_container, new PwdManagerFragment());mit();}/*** 进入密码输入界面*/private void loadPwEnterFragment() {Log.d(TAG, "进入密码输入");FragmentManager fm = getSupportFragmentManager();FragmentTransaction transaction = fm.beginTransaction();transaction.replace(R.id.als_container, new PwdEnterFragment());mit();public void setAppLockTitle(String title) {mTvTitle.setText(title);}}创建所有的fragment创建上诉对应的两个fragment以及之前逻辑图中分析所需要用到的fragment,注意需要用supportV4包中的兼容包,兼容低版本。

安卓中知识点总结

安卓中知识点总结

安卓中知识点总结作为一名Android开发者,了解和掌握Android开发的知识点是非常重要的。

本文将对Android开发涉及的各种知识点进行总结,包括Java语言基础、Android框架、界面设计、数据库操作、网络请求、性能优化等方面的知识点。

一、Java语言基础1. 类和对象类是Java语言中的基本概念,它是对象的模板。

对象是类的实例,是具体的实体。

了解类和对象的概念是Java编程的基础。

2. 继承和多态继承是Java语言中非常重要的特性,它使得子类可以继承父类的属性和方法。

多态是继承的延伸,它使得一个对象可以以多种形态出现,提高了程序的灵活性和扩展性。

3. 接口和抽象类接口和抽象类都是Java中用来实现多态和封装的机制,它们可以让程序员定义一个函数,并且由实现类来实现该函数的具体功能。

4. 异常处理异常处理是Java语言中的重要机制,在处理IO异常、运行时异常等方面都有着重要作用。

5. 泛型泛型是Java中的一个重要特性,它使得类或方法可以接受任意类型的数据作为参数,提高了代码的复用性和灵活性。

6. 并发并发是指在同一时间段内同时运行多个程序或多个线程。

在Android开发中,了解并发编程的知识点可以帮助我们编写高效的多线程应用。

7. I/O流I/O流是Java中用来进行输入输出操作的重要概念,了解文件操作、网络操作、序列化等知识点对Android开发非常重要。

二、Android框架1. ActivityActivity是Android应用的一个重要组件,它负责提供一个用户界面来展示和与用户交互。

了解Activity的生命周期、启动方式、传递数据等知识点是非常重要的。

2. FragmentFragment是Android中用来实现复杂界面的一种重要组件,它可以在一个Activity中管理多个界面碎片。

了解Fragment的生命周期、使用方式、通信方式等知识点是非常重要的。

3. ServiceService是Android中用来实现后台任务的一种组件,它可以在后台执行长时间运行的任务。

【济南中心】Android课程同步笔记day10:Android应用开发基础

【济南中心】Android课程同步笔记day10:Android应用开发基础

【济南中心】Android课程同步笔记day10:Android应用开发基础图形的位图表示方法位图:由许多点组成的点阵图。

构成位图的点称为像素。

目前Android中使用的都是位图。

位图大小的计算1. 单色= 1位= 八分之一byte,每个像素占用八分之一byte200 * 200 / 8 = 50002. 2的24次幂色(约1600万) = 24位= 3byte,每个像素占用3byte200 * 200 * 3 = 1200003. 256色= 8位= 1byte,每个像素占用1byte200 * 200 = 40000矢量图:矢量图形是通过计算机将一串线条和图形转换为一系列指令,在计算机中只存储这些指令,而不是像素。

矢量图形看起来没有位图图像真实,但矢量图形的存储空间比位图图像要小得多,而且矢量图形通过拉伸、移动、放大等操作,图形不会产生实真。

加载大图片存在的问题:加载大图片会出现内存溢出的异常(OOM)产生的原因:1.Android中的图片使用32位的ARGB模式,A-透明度、R-红色值、G-绿色值、B-蓝色值。

每个像素都要占用4个byte。

2.用图片的分辨率乘以4就得到了图片在Android中所需的内存空间大约为15M,模拟器默认每个应用占用的内存为16M,所以就产生了内存溢出(OOM)处理方法:思路:先获取图片的分辨率和手机的分辨率,计算出压缩比,加载时加载压缩后的图片Bitmap bitmap =decodeSampledBitmapFromResource("mnt/sdcard/big.jpg", screenWidth, screenHeight);iv.setImageBitmap(bitmap);/*** 获取压缩后的图片* @param pathName 图片的路径* @param reqWidth 要显示的宽* @param reqHeight 要显示的高*/public static Bitmap decodeSampledBitmapFromResource (String pathName, int reqWidth, int reqHeight){//1.第一次解析将inJustDecodeBounds设置为true,来获取图片大小final BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;BitmapFactory.decodeFile(pathName, options);//2.调用计算压缩比的工具方法,计算出inSampleSize的值options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);//3.使用计算好的压缩比,获得压缩后的图片options.inJustDecodeBounds = false;return BitmapFactory.decodeFile(pathName, options);}/*** 计算压缩比* @param options 加载图片的参数* @param reqWidth 要显示的宽* @param reqHeight 要显示的高*/public static int calculateInSampleSize (BitmapFactory.Options options, int reqWidth, int reqHeight){//源图片的高度和宽度final int height = options.outHeight;final int width = options.outWidth;int inSampleSize = 1;//如果源图片的宽高大于要显示的宽高,则需要压缩if (height > reqHeight || width > reqWidth) {// 计算出实际宽高和目标宽高的比率final int heightRatio = Math.round((float) height / (float) reqHeight);final int widthRatio = Math.round((float) width / (float) reqWidth);// 选择宽和高中最小的比率作为inSampleSize的值,这样可以保证最终图片的宽和高// 一定都会大于等于目标的宽和高。

【济南中心】Android课程同步笔记day03:Android应用之安全卫士

【济南中心】Android课程同步笔记day03:Android应用之安全卫士

【济南中心】Android课程同步笔记day03:Android应用之安全卫士今天主要是手机防盗设置向导页面的搭建,总结下今天所用到的技能点shape画小圆点选中的时候point_select.xml:<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="/apk/res/android"android:shape="oval" ><corners android:radius="8dp" /><solid android:color="#A9D417" /></shape>未选中的时候point_normal.xml:<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="/apk/res/android"android:shape="oval" ><corners android:radius="8dp" /><solid android:color="#44000000" /></shape>界面切换动画5 个向导界面之间进行切换的时候,界面都是一闪而过的,为了让界面的过渡效果更加好看,这里在不同界面之间的切换中加入过渡动画的效果,即界面是慢慢滑过去的。

为了更好的分析下一步和上一步切换界面时不同的过渡平移动画,这里画出了一张当前页、上一页、下一页的演示图,如下图所示分析可知:当点击下一步时,当前页在x 轴从0 到-100%p,下一页从100%p 到0;点击上一步时,当前页从0 到100%p,上一页从-100%p 到0,我们在res 目录下新建一个名为anim 的目录,将代码放到目录下。

android移动应用开发技术课第一章笔记

android移动应用开发技术课第一章笔记

android移动应用开发技术课第一章笔记第一章:Android移动应用开发技术课笔记一、引言在当今移动互联网时代,Android系统以其开放性和普及率成为了最受欢迎的移动操作系统之一。

随着移动应用市场的不断扩大,对Android移动应用开发技术的需求也日益增加。

学习和掌握Android移动应用开发技术成为了越来越多人的选择。

二、Android移动应用开发技术概述1. 什么是Android?Android是一款基于Linux操作系统的开源移动设备操作系统,主要用于触摸屏移动设备,如智能手机和平板电脑。

Android操作系统的开放性使得开发者可以自由定制和开发应用,受到了广大用户的喜爱。

2. Android移动应用开发技术的重要性随着信息化和数字化的发展,移动应用成为了人们获取信息和进行交流的重要方式。

而Android作为最主流的移动操作系统之一,其应用的开发和推广具有巨大的市场潜力和商业价值。

掌握Android移动应用开发技术成为了许多开发者和从业者的追求目标。

三、学习Android移动应用开发技术的重要性1. 对于个人的意义学习Android移动应用开发技术可以提升个人的职业技能,并且在移动应用开发领域有更多的发展机会。

可以通过开发自己的应用来实现个人价值和创造财富。

2. 对于企业的意义随着移动互联网的发展,各类企业都希望拥有自己的移动应用,以提升品牌形象和服务用户。

懂得Android移动应用开发技术的人才对企业来说显得格外宝贵。

四、学习Android移动应用开发技术的途径1. 自学通过阅读相关书籍、网上教程和参加线上培训班,可以自学Android 移动应用开发技术。

这种方式需要具备较好的自学能力和毅力。

2. 参加培训班选择权威的培训机构进行系统的学习和培训,可以更快速、系统地学习Android移动应用开发技术。

五、Android移动应用开发技术的未来发展随着人工智能、物联网、区块链等技术的不断发展,Android移动应用开发技术也将不断拓展应用场景和技术深度。

【济南中心】Android课程同步笔记day09:Android应用开发基础

【济南中心】Android课程同步笔记day09:Android应用开发基础

【济南中心】Android课程同步笔记day09:Android应用开发基础四大组件:Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器,前面几张讲过activity、service和BroadcastReceiver,在这一章里主要介绍ContentProvider。

内容提供者的作用:应用程序创建的数据库默认都是私有的,别的应用程序不可以访问里面的数据。

如果有需求把自己应用程序私有的数据库暴露给别的用户,就需要使用内容提供者。

创建内容提供者:1. 创建一个类继承ContentProviderpublic class BankDBBackdoor extends ContentProvider {}2. 在清单文件的application节点中进行配置<applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" >......<providerandroid:name="com.itheima.db.BankDBBackdoor"//必须配置该主机名,访问者使用该主机名才能访问android:authorities="com.itheima.db" ></provider></application>3. 重写内容提供者中的insert等方法访问内容提供者:// 得到内容提供者的解析器ContentResolver resolver = getContentResolver();// 访问内容提供者主要通过uri来访问Uri uri = Uri.parse("content://com.itheima.db");ContentValues values = new ContentValues();// 通过内容解析器让内容提供者添加一条数据resolver.insert(uri, values);UriMatcher的使用步骤:1. 创建一个UriMatcher,并初始化//初始化为不匹配static UriMatcher mUriMatcher = newUriMatcher(UriMatcher.NO_MATCH);2. 创建一些匹配规则//如果uri满足content://com.itheima.db/account,则返回SUCCESS这个常量值static {mUriMatcher.addURI("com.itheima.db", "account", SUCCESS);}//系统短信应用的匹配规则private static final UriMatcher sURLMatcher = newUriMatcher(UriMatcher.NO_MATCH);static {sURLMatcher.addURI("sms", null, SMS_ALL); //所有短信sURLMatcher.addURI("sms", "inbox", SMS_INBOX); //收件箱sURLMatcher.addURI("sms", "sent", SMS_SENT); //发件箱sURLMatcher.addURI("sms", "draft", SMS_DRAFT); //草稿箱 }3. 在insert等方法中,先使用match(Uri uri)方法匹配一个uri,然后根据返回的值进行不同的操作int code = mUriMatcher.match(uri);if (code == SMS_ALL) {......}elseif (code == SMS_INBOX){......}内容提供者编写的流程:1. 创建一个类继承ContentProviderpublic class BankDBBackdoor extends ContentProvider {} 2. 在清单文件的application节点中进行配置<applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" >......<providerandroid:name="com.itheima.db.BankDBBackdoor"//必须配置该主机名,访问者使用该主机名才能访问 android:authorities="com.itheima.db" ></provider></application>3. 在内容提供者代码的内部声明UriMatcher,创建匹配规则public static final int SUCCESS = 1;/*** 创建一个保安,检查uri的规则,如果uri匹配失败返回-1*/static UriMatcher mUriMatcher = newUriMatcher(UriMatcher.NO_MATCH);static {mUriMatcher.addURI("com.itheima.db", "account", SUCCESS);}4. 实现增删改查的方法,通过uriMatcher的返回值确定要做什么操作5. 在另外一个应用程序里面,通过contentResolver进行增删改查学习内容提供者的目的:1. 了解内容提供者原理2. 能看懂系统源码3. 获取系统应用内容提供者所提供的数据,例如联系人、短信应用如何去分析系统应用的内容提供者:1. 查看数据库,分析数据库的表和字段2. 操作内容提供者需要uri3. 找到系统应用的源代码,首先去清单文件中查找主机名authorities<provider android:name="SmsProvider"android:authorities="sms"android:multiprocess="true"android:readPermission="android.permission.READ_SMS"android:writePermission="android.permission.WRITE_SMS" />4. 去对应的Provider的源代码中查找匹配规则,确定表名static {sURLMatcher.addURI("sms", null, SMS_ALL); //所有短信sURLMatcher.addURI("sms", "inbox", SMS_INBOX); //收件箱sURLMatcher.addURI("sms", "sent", SMS_SENT); //发件箱sURLMatcher.addURI("sms", "draft", SMS_DRAFT); //草稿箱 }5. 根据主机名和表名确定uri,使用ContentResolver的增删改查方法操作对应的数据库通知栏提醒Notification:显示在另外一个进程的界面里面的1. 在低版本中的写法(api小于16),创建Notification时直接new Notification()NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);//1.初始化NotificationNotification notification = new Notification(R.drawable.ic_launcher, "有新的消息到来了", System.currentTimeMillis());//2.创建通知栏的点击事件Intent intent = new Intent();intent.setAction(Intent.ACTION_CALL);intent.setData(Uri.parse("tel://110"));//PendingIntent延时的意图,可以打开Activity、Service和发送广播PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, 0);//3.设置通知的点击事件notification.setLatestEventInfo(this, "我是标题", "我是文本", contentIntent);//点击自动关闭消息notification.flags |= Notification.FLAG_AUTO_CANCEL;//4.显示通知nm.notify(0, notification);2. 在高版本中的写法(api大于等于16),创建Notification时使用Notification.BuilderNotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);//1.初始化NotificationNotification notification = new Notification.Builder(this).setContentTitle("我是标题").setContentText("我是文本").setSmallIcon(R.drawable.ic_launcher).setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher)).setContentIntent(PendingIntent intent) //设置点击事件setAutoCancel(true)//点击后自动关闭.build();//2.显示通知nm.notify(0, notification);3. Notification中使用自定义Viewapi小于16Notification notification = new Notification(R.drawable.ic_launcher, "有新的消息到来了", System.currentTimeMillis());//设置自定义布局RemoteViews remoteViews = newRemoteViews(getPackageName(), yout.xxx);notification.contentView = remoteViews;api大于16Builder builder = Notification.Builder(this);//设置自定义布局builder.setContent(RemoteViews views);4. RemoteViews使用方式RemoteViews views = new RemoteViews(getPackageName(),yout.xxx);views.setTextViewText(R.id.xxx, "hello"); //设置TextView的文本views.setImageViewResource(R.id.xxx, R.drawable.xxx); //设置ImageView的图片views.setOnClickPendingIntent(R.id.xx, pendingIntent); //设置按钮的点击事件如何打开短信界面:尝试打开系统某个界面的思路:1. 从logcat中查看是哪个Activity2. 在上层源码中搜索该工程3. 查看清单文件中是否有隐式意图可以激活//打开短信界面的隐式意图Intent intent = new Intent();intent.setAction("android.intent.action.MAIN");intent.addCategory("android.intent.category.DEFAULT");intent.setType("vnd.android.cursor.dir/mms");startActivity(intent);联系人数据库:1. 路径:data/data/com.android.providers.contacts/databases/contacts2.db 2. 主要操作的3张表:1. raw_contact:联系人的id表* contact_id 保存联系人的id2. data:联系人的数据表* raw_contact_id 表示属于哪个联系人* data1 具体的数据* mimetype_id 数据的类型,使用该id去mimetypes表中查询数据类型3. mimetypes:联系人的数据类型表3. 查询联系人数据库的数据的步骤1. 查询raw_contact表,获取所有联系人id2. 根据联系人id,查询data表,该联系人的所有数据3. 根据mimetype确定数据类型如何读取联系人数据:ContentResolver resolver = getContentResolver();//1.查询raw_contact表,获取所有联系人idUri uri = Uri.parse("content://com.android.contacts/raw_contacts");Uri datauri = Uri.parse("content://com.android.contacts/data");Cursor cursor = resolver.query(uri, new String[]{"contact_id"}, null, null, null);while(cursor.moveToNext()){String id = cursor.getString(0);System.out.println("Id:"+id);//2.根据联系人id,查询data表,该联系人的所有数据Cursor datacursor = resolver.query(datauri, newString[]{"data1","mimetype"}, "raw_contact_id=?", new String[]{id}, null);while(datacursor.moveToNext()){//3.根据mimetype确定数据类型String data1 = datacursor.getString(0);System.out.println("data1:"+data1);String mimetype = datacursor.getString(1);System.out.println("mimetype:"+mimetype);}datacursor.close();System.out.println("------------");}cursor.close();* 备注:加上READ_CONTACTS权限,取mimetype时有个小细节,直接在data表里面就可以查询mimetype数据类型了,实际是查询数据库中的视图。

【黑马程序员济南】Android课程同步笔记智慧北京:Day07(上)

【黑马程序员济南】Android课程同步笔记智慧北京:Day07(上)

【黑马程序员】Android课程同步笔记智慧北京:Day07(上)智慧北京是一个新闻资讯类的项目,里面包含新闻展示、模块分类、以及视频播放的功能,今天我们主要讲解视频播放这一功能的实现,学完今天的课程我相信大家就能明白市面上大部分app含有在线播放视频的功能是怎么实现的了,好,下面开始咱们的课程,首先看一下我们今天的学习目标。

学习目标熟练使用RecyclerView显示列表数据了解MediaPlayer播放原理熟练使用MediaPlayer播放在线视频熟悉MediaPlayer常见的监听掌握MediaPlayer播放,暂停,重播等功能能够对SeekBar自定义样式视频-项目基本结构搭建引言由于市面上大部分app含有在线播放视频的功能。

在列表中,嵌套一些视频,当我们点击播放按钮,就可以在线播放视频。

回顾大家思考一下,如何实现这样的功能呢?整体的列表我们可以参考使用:recyclerView + adapter列表每个条目中我们可以使用:TextView显示视频标题TextureView + MeidaPlayer来实现视频播放界面好!接下来,跟随传智播客一起搭建项目的基本结构框架项目的分析基本项目的结构包含以下内容:l RecyclerView + Adapter + Holderl 控件的初始化ButterKniftl 联网:权限l 布局管理器、分割线l 视频播放界面使用TextureView + MeidaPlayer实现步骤首先我们初始RecyclerView + adapter将列表显示出来!第一步:创建MainActivity界面布局在项目的res/layout目录下创建MainActivity布局<?xml version="1.0" encoding="utf-8"?><!--传智播客--><RelativeLayout xmlns:android="/apk/res/android"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.itheima.videoplayerlist.MainActivity"><android.support.v7.widget.RecyclerViewandroid:id="@+id/rv"android:layout_width="match_parent"android:layout_height="match_parent"/></RelativeLayout>第二步:初始化控件public class MainActivity extends AppCompatActivity {//传智播客@BindView(R.id.rv)RecyclerView rv;private List<VideoPlayerItemInfo> videoPlayerItemInfoList;private LinearLayoutManager lm;private VideoPlayListAdatper adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);ButterKnife.bind(this);//网络视频路径String url ="/videolib3/1604/28/fVobI0704/SD/fVobI0704-mobile. mp4";//数据的初始化videoPlayerItemInfoList = new ArrayList<>();for (int i = 0; i < 10; i++) {videoPlayerItemInfoList.add(new VideoPlayerItemInfo(i,url));}//初始化RecyclerViewlm = new LinearLayoutManager(this);//设置布局管理器rv.setLayoutManager(lm);//添加分割线rv.addItemDecoration(newRecycleViewDivider(this,LinearLayoutManager.HORIZONTAL,1, Color.BLACK));//创建适配器adapter = new VideoPlayListAdatper(this, videoPlayerItemInfoList);//设置适配器rv.setAdapter(adapter);}}第三步:适配器public class VideoPlayListAdatper extends RecyclerView.Adapter {//传智播客private Context context;private List<VideoPlayerItemInfo> videoPlayerItemInfoList;public VideoPlayListAdatper(Context context, List<VideoPlayerItemInfo> videoPlayerItemInfoList) {this.context = context;this.videoPlayerItemInfoList = videoPlayerItemInfoList;}@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = LayoutInflater.from(context).inflate(yout.item_video_play, parent, false);MyViewHolder viewHolder = new MyViewHolder(view);return viewHolder;}@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { }@Overridepublic int getItemCount() {return videoPlayerItemInfoList != null ? videoPlayerItemInfoList.size() : 0;}}第四步:设置适配器public class MainActivity extends AppCompatActivity {//传智播客@BindView(R.id.rv)RecyclerView rv;private List<VideoPlayerItemInfo> videoPlayerItemInfoList;private LinearLayoutManager lm;private VideoPlayListAdatper adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);ButterKnife.bind(this);//网络视频路径String url ="/videolib3/1604/28/fVobI0704/SD/fVobI0704-mobile. mp4";//数据的初始化videoPlayerItemInfoList = new ArrayList<>();for (int i = 0; i < 10; i++) {videoPlayerItemInfoList.add(new VideoPlayerItemInfo(i,url));}//初始化RecyclerViewlm = new LinearLayoutManager(this);//设置布局管理器rv.setLayoutManager(lm);//添加分割线rv.addItemDecoration(newRecycleViewDivider(this,LinearLayoutManager.HORIZONTAL,1, Color.BLACK));//创建适配器adapter = new VideoPlayListAdatper(this, videoPlayerItemInfoList);//设置适配器rv.setAdapter(adapter);}}视频-条目布局的分析和设计引言项目的基本结构搭建出来,之后,接下来我们分析一下每个条目的布局设计。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

【济南中心】Android课程同步笔记day01:
Android应用之安全卫士
代码的组织方式:
- 业务逻辑模块组织代码
小米阅读
1. 阅读器reader com.xiaomi.reader
2. 分享share com.xiaomi.share
3. 便签note com.xiaomi.note
- 根据代码的类型组织包结构
1. 界面com.itheima.mobilesafe.activities
2. 服务com.itheima.mobilesafe.services
3. 业务逻辑com.itheima.mobilesafe.engine
4. 数据库com.itheima.mobilesafe.db
5. 数据库增删改查com.itheima.mobilesafe.db.dao
6. 工具类com.itheima.mobilesafe.utils
7. 自定义view com.itheima.mobilesafe.ui
splash界面的作用:
1. 展现产品的logo,提升产品的知名度.
2. 初始化应用程序的数据.
3. 连接服务器,查找可更新的版本,自动更新
4. 用户操作指南
5. 新版本特性提醒
布局文件的命名规则:
SplashActivity--->activity_spalsh.xml
XxxActivity---> activity_xxx.xml
获取应用程序版本号:
//用PackageManager拿到PackageInfo,PackageInfo中的versionName
PackageInfo packinfo = context.getPackageManager().getPackageInfo(
context.getPackageName(), 0);
String version = packinfo.versionName;
源代码版本控制:
- 安装VisualSVN Server——SVN服务器,一直下一步即可
- 导入仓库到服务器
1.在Repositories处右键,选择Import Existing Repository
2.选择Copy repository from another location,下一步
3.点击Browse,选择仓库路径,"代码/代码仓库/Repository/mobilesafe",点击下一步
4.点击Import
5.点击Finish,导入完成
- 安装TortoiseSVN——SVN客户端,一直下一步即可
1.在想要检出代码的地方右键,选择SVN Checkout
2.URL of repository处填https://127.0.0.1/svn/mobilesafe/,地址也可以从SVN服务器的mobilesafe处右键选择Copy URL to clipboard拷贝
3.Checkout directory出填写检出代码要放的位置,然后点击OK
4.完成代码的检出
- 将代码更新到指定版本
1.mobilesafe文件夹出右键,选择Update to version
2.点击show log
3.点击左下角的show all
4.选择要更新的版本,点击OK
5.版本更新完成
应用自动更新的逻辑图:
获取服务器版本号:
//获取服务器地址
String path = getResources().getString(R.string.url);
URL url = new URL(path);
//创建网络连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
//发出请求,获得返回码
int code = conn.getResponseCode();
if(code ==200){
//获取服务器返回的流并进行解析
InputStream is = conn.getInputStream();
String result = StreamTools.readStream(is);
//转化为json并解析出版本号
JSONObject json = new JSONObject(result);
String serverVersion = json.getString("version");
Log.i(TAG,"服务器版本:"+serverVersion);
}
将流转化为字符串:
public static String readStream(InputStream is) throws IOException{
//ByteArrayOutputStream类是在创建它的实例时,程序内部创建一个byte 型数组的缓冲区,缓冲区会随着数据的不断写入而自动增长。

可使用toByteArray()和toString()获取数据
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while((len = is.read(buffer))!=-1){
baos.write(buffer, 0, len);
}
is.close();
return baos.toString();
}
弹出对话框:
1.使用AlertDialog.Builder
2.设置标题、信息、点击事件等
3.调用show方法显示出来,调用dismiss方法消失
下载apk :
1.使用开源框架xUtils
2.使用HttpUtils的download方法,填入三个参数:服务器下载地址,手
机中的存储位置、回调事件
3.回调事件中有三个常用的方法:onSuccess下载成功、onFailure下载失败、onLoading更新下载进度
安装apk:
1.调用系统的安装apk的界面,传入对应的参数
2.具体实现方式
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.setDataAndType(
Uri.fromFile(fileinfo.result),
"application/vnd.android.package-archive");
startActivity(intent);
应用程序的覆盖安装要满足的条件:
1. 两个版本签名一致
2. 两个版本包名一致
跑马灯效果的TextView:
1. 系统的TextView不能获取焦点,使用自定义控件
2. 继承TextView控件,重写isFocused方法,直接返回true,让其获取焦点
3. 设置android:ellipsize="marquee"
旋转的黑马logo:
1. 使用系统提供的属性动画
2. 具体实现方式
ObjectAnimator oa = ObjectAnimator.ofFloat(iv_home_logo, "rotationY",
45, 90, 135, 180, 225, 270, 315);
oa.setDuration(3000);
oa.setRepeatCount(ObjectAnimator.INFINITE);
oa.setRepeatMode(ObjectAnimator.RESTART);
oa.start();。

相关文档
最新文档