安卓开发
没什么,从硬件跨来软件耍耍
诺亚方包
这个作者很懒,什么都没留下…
展开
-
Android >> 55. 局域网共享
无线网络管理器WiFiManagerApp 若想访问外网资源,得先判断网络连接是否可用。当时检测连接的工具采用 了连接管理器 ConnectiityManager ,上网方式主要有两种,即数据连接和 WIFI 。不过ConnectivityManager 能笼统的判断能否上网并不能获知 WIFI 连接的详细信息。当前网络类型是 WIFI 时,要想得知 WIF 上网的具体信息,需另外通过无线网络...原创 2019-08-09 15:49:49 · 707 阅读 · 0 评论 -
Android >> 54. Lambda 表达式
若想要在Android 项目中使用Lambda 表达式或者Java 8 的其他新特性,首先需要修改app/build.gradle 文件:android { ... defaultConfig { ... jackOptions.enabled = true } compileOptions { sourceCompatibility JavaVersion.VERSION_...原创 2019-08-08 06:56:30 · 120 阅读 · 0 评论 -
Android >> 53. 创建定时任务
Android 中的定时任务一般有两种实现方式,一种是使用Java API 里提供 的Timer 类,一种是使用Android 的Alarm 机制。这两种方式在多数情况下都能实现类似的效果,但Timer 有一个明显的短板,它并不太适用于那些需要长期在后台运行的定时任务。Android 手机就会在长时间不操作的情况下自动让CPU 进入到睡眠状态,这就有可能导致Timer 中的定时任务无法正常运行...原创 2019-08-08 05:40:24 · 274 阅读 · 0 评论 -
Android >> 52. 定制自己的日志工具
我们需要在当程序处于开发阶段时让日志打印出来,但当程序上线之后就把日志屏蔽掉。我们只需要定制一个自己的日志工具即可。新建一个LogUtil 类:public class LogUtil { public static final int VERBOSE = 1; public static final int DEBUG = 2; public static final int INF...原创 2019-08-08 04:10:54 · 158 阅读 · 0 评论 -
Android >> 51. 使用Intent 传递对象
我们知道,若只是传输一些常用的数据类型的数据,例如String、int 等。可以使用intent.putExtra() 方法。但是当我们需要传递一些自定义对象的时候,就需要使用如下方式:使用Intent 来传递对象通常有两种实现方式:Serializable 和Parcelable。Serializable 方式Serializable 是序列化的意思,表示将一个对象转换成可存储或可传输的...原创 2019-08-08 01:32:03 · 160 阅读 · 0 评论 -
Android >> 50. 全局获取Context
Android 提供了一个Application 类,每当应用程序启动的时候,系统就会自动将这个类进行初始化。而我们可以定制一个自己的Application 类,以便于管理程序内一些全局的状态信息,比如说全 局 Context。然后我们就可以在项目的任何地方都能轻松获取到Context构建自己的Application1. 创建一个MyApplication 类继承自Applicationc...原创 2019-08-08 00:42:52 · 137 阅读 · 0 评论 -
Android >> 49. Material Design(七)将系统状态栏融入背景
在Android 5.0 及之后的系统都是支持将系统状态栏融入背景这个功能的,因此这里我们就来实现一个系统差异型的效果,在Android 5.0 及之后的系统中,使用背景图和状态栏融合的模式,在之前的系统中使用普通的模式。想要让背景图能够和系统状态栏融合,需要借助android:fitsSystemWindows 这个属性来实现。在CoordinatorLayout、AppBarLayout、...原创 2019-08-06 22:17:49 · 234 阅读 · 0 评论 -
Android >> 48. Material Design(六)可折叠式标题栏
CollapsingToolbarLayoutCollapsingToolbarLayout 是一个作用于Toolbar 基础之上的布局,它也是由Design Support 库提供的。CollapsingToolbarLayout 可以让 Toolbar 的效果变得更加丰富,不仅仅是展示一个标题栏,而是能够实现非常华丽的效果。不过,CollapsingToolbarLayout 是不能独立存...原创 2019-08-06 21:16:08 · 404 阅读 · 0 评论 -
getAdapterPosition() 等于 -1 的解决办法
说实话,遇到这个问题,我找了很久没有找到问题在哪,但是我想到另一种解决办法,也许对你有用。我一开始是在RecyclerView 的Adapter 类的setOnClickListener() 方法中调用getAdapterPosition() 方法的:public FruitAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup p...原创 2019-08-06 19:27:55 · 3899 阅读 · 14 评论 -
(androidx.appcompat.widget.Toolbar) cannot be applied to (android.widget.Toolbar)
当出现这个或是类似的错误时,说明我们的Toolbar 并不是它所想要的Toolbar,也就是说明我们需要将我们的Toolbar 转变一下类型。当然,通过名字是无法进行类型转换的,因为代码里都是:Toolbar toolbar = new Toolbar;解决办法就是将import 改掉:import android.widget.TextView;import android.widg...原创 2019-08-06 19:22:08 · 8265 阅读 · 1 评论 -
Android >> 47. Material Design(五)下拉刷新
SwipeRefreshLayout 就是用于实现下拉刷新功能的核心类放置刷新控件<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-au...原创 2019-08-06 12:55:29 · 218 阅读 · 0 评论 -
Android >> 46. Material Design(四)卡片式布局
CardViewCardView 也是一个FrameLayout,只是额外提供了圆角和阴影等效果,看上去会有立体的感觉。我在此使用RecyclerView 内嵌CardView 进行演示因为我们要使用RecyclerView、CardView 和Glide(开源图片加载库https://github.com/bumptech/glide)所以需要添加以下dependencies:impl...原创 2019-08-05 19:42:49 · 336 阅读 · 0 评论 -
Android >> 45. Material Design(三)悬浮按钮和可交互提示
FloatingActionButton和普通Button 没什么两样,首先xml 文件中添加控件,然后java 文件中获取实例并处理点击事件。<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http:/...原创 2019-08-05 14:59:58 · 233 阅读 · 0 评论 -
Android >> 44. Material Design(二)滑动菜单
DrawerLayout很简单:<androidx.drawerlayout.widget.DrawerLayout android:id="@+id/drawer_layout" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent"...原创 2019-08-05 13:17:43 · 393 阅读 · 0 评论 -
Android >> 43. Material Design(一)Toolbar
Toolbar先把系统自带的Actionbar 设置为NoActionBar在xml 文件中放置一个Toolbar 控件:<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" ...原创 2019-08-06 10:30:39 · 220 阅读 · 0 评论 -
Android >> 42. 基于位置的服务(Location Based Service)
我们先调用百度的定位API:原创 2019-08-04 21:44:46 · 553 阅读 · 0 评论 -
Android >> 40. 服务(二)
定义一个服务项目列表:包名 → New → Service → Service,然后Finish 即可除了onBind() 这个抽象方法,我们还需要再重写几个:onCreate()、onStartCommand()、onDestroy()public class MyService extends Service { public MyService() { } @...原创 2019-08-03 20:34:12 · 279 阅读 · 0 评论 -
Android >> 41. 通知(Notification)
通知的基本用法首先需要一个NotificationManager 来对通知进行管理,可以调用Context 的getSystemService() 方法获取到。getSystemService() 方法接收一个字符串参数用于确定获取系统的哪个服务,我们传入Context.NOTIFICATION_SERVICE 即可:NotificationManager manager = (Notifi...原创 2019-08-03 17:01:47 · 208 阅读 · 0 评论 -
对于SkAndroidCodec::NewFromStream returned null,我的解决方案
我遇到这个问题,而不能成功创建通知,原因是我的API 大于26,需要创建NotificationChannelNotification notification = new NotificationCompat.Builder(this, "chat") .setContentTitle("标题") .setContentText("内容") .s...原创 2019-08-03 15:11:44 · 2343 阅读 · 0 评论 -
Android >> 39. 服务(一)实现多线程
服务并不是运行在一个独立的进程当中的,而是依赖于创建服务时所在的应用程序进程。当某个应用程序进程被杀掉时, 所有依赖于该进程的服务也会停止运行。实际上服务并不会自动开启线程,所有的代码都是默认运行在主线程当中的。也就是说,我们需要在服务的内部手动创建子线程,并在这里执行具体的任务,否则就有可能出现主线程被阻塞住的情况。线程子线程的创建方法:实现Runnable 接口class MyT...原创 2019-08-02 22:53:47 · 258 阅读 · 0 评论 -
Android >> 38. 使用网络(二)
解析JSON 格式数据先准备一个文件:新建一个get_data.json 文件,编辑,输入:[{"id":"5","version":"5.5","name":"Clash of Clans"},{"id":"6","version":"8.0","name":"Boom of Beach"},{"id":"7","version":"10.0","name":"Waao"}]PC ...原创 2019-08-01 09:58:48 · 354 阅读 · 0 评论 -
Android >> 37. 使用网络(一)
使用网络都要声明权限:<uses-permission android:name="android.permission.INTERNET" />WebView 的用法webView = findViewById(R.id.web_view);webView.getSettings().setJavaScriptEnabled(true);webView.setWebVie...原创 2019-08-01 08:52:36 · 312 阅读 · 0 评论 -
Android >> 36. 内容提供器(Content Provider)(二)
接着 Android >> 35. 内容提供器(Content Provider)(一)创建自己的内容提供器原创 2019-07-31 16:33:30 · 143 阅读 · 0 评论 -
Android >> 35. 内容提供器(Content Provider)(一)
内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性。不同于文件存储和SharedPreferences存储中的两种全局可读写操作模式,内容提供器可以选择只对哪一部分数据进行共享,从而保证我们程序中的隐私数据不会有泄漏的风险。运行时权限用户不需要在安装软件的时候一...原创 2019-07-31 14:49:45 · 346 阅读 · 0 评论 -
Android >> 33. SQLite 数据库存储(二)
我们对数据的操作无非有4种,即CRUD:添加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)添加数据调用SQLiteOpenHelper 的getWritableDatabase() 或getReadableDatabase() 不仅可以用于创建和升级数据库,还会返回一个SQLiteDatabase 对象SQLiteDatabase 中提供了一个inse...原创 2019-07-30 15:39:29 · 189 阅读 · 0 评论 -
Android >> 32. SQLite 数据库存储(一)
SQLite是一款轻量级的关系型数据库,它的运算速度非常快,占用资源很少。SQLite不仅支持 标准的SQL语法,还遵循了数据库的ACID事务。创建数据库Android为了让我们能够更加方便地管理数据库,专门提供了一个SQLiteOpenHelper 帮助类,借助这个类就可以非常简单地对数据库进行创建和升级。SQLiteOpenHelper 是一个抽象类,我们需要创建一个自己的帮助类去继承...原创 2019-07-30 15:38:59 · 134 阅读 · 0 评论 -
Android >> 32. 广播-Broadcast(三)
使用本地广播Android 引入了一套本地广播机制用于解决系统全局广播的安全性问题,这个机制发出的广播只能够在应用程序的内部进行传递,而且广播接收器也只能接收来自本应用程序发出的广播。本地广播的使用主要就是使用了一个LocalBroadcastManager 来对广播进行管理,并提供了发送广播和注册广播接收器的方法发送本地广播localBroadcastManager = LocalBro...原创 2019-07-29 23:22:29 · 179 阅读 · 0 评论 -
Android >> 31. 广播-Broadcast(二)
发送自定义广播发送标准广播Intent intent = new Intent("com.example.broadcasttest.My_BROADCAST");sendBroadcast(intent);标准广播不能发送系统广播内容,否则闪退由于广播是使用Intent 进行传递的,因此我们可以在Intent 中携带一些数据传递给广播接收器。发送有序广播Intent intent...原创 2019-07-29 22:51:30 · 170 阅读 · 0 评论 -
Android >> 30. 广播-Broadcast(一)
为了便于进行系统级别的消息通知,Android 引入了Broadcast 机制。Android 中每个应用程序都可以对自己感兴趣的Broadcast 进行注册,其消息可能来自系统,也可能来自其他应用程序。Android 的Broadcast 主要分为两种:标准广播(Normal broadcasts)和有序广播(Ordered broadcasts)Normal broadcasts在广播...原创 2019-07-29 22:20:30 · 209 阅读 · 0 评论 -
Android >> 29. 一键退出所有Activity
用一个专门的集合类对所有的活动进行管理新建一个ActivityCollector 类作为活动管理器public static class ActivityCollector{ public static List<Activity> activityList = new ArrayList<>(); public static void addActi...原创 2019-07-29 20:39:29 · 186 阅读 · 0 评论 -
Android >> 28. Activity 的启动方式
启动方式一共有4种:standard、singleTop、singleTask、singleInstance在AndroidManifest.xml 文件中通过给<activity> 标签指定android:launbhMode 属性来选择启动模式1. standardstandard 是Activity 默认的启动模式。我们知道Android 是通过返回栈来管理活动的,在st...原创 2019-07-28 15:27:01 · 137 阅读 · 0 评论 -
Android >> SocketException: socket failed: EACCES (Permission denied)
今天在我的客户端测试Socket 连接的时候总是失败,其实我第一想到的就是没有给予网络权限,但是我看了看Manifest 文件,有网络权限啊。。。<uses-permission android:name="android.perission.INTERNET" />然后经过一番折腾,最后发现我的权限当中的permission 拼错了。。。应该是<uses-permis...原创 2019-07-28 13:54:30 · 820 阅读 · 0 评论 -
Android Studio:unable to locate adb 所引发的血案
好吧,我承认今天有点标题党的感觉。今天上午,不知为何,突然出现了如标题所述的错误。于是我就a原创 2019-07-27 20:40:11 · 3379 阅读 · 0 评论 -
Android >> 27. Android Studio 9-Patch 图片制作以及带气泡对话框的制作
9-Patch 图片制作在AS 中右击图片,然后选择create 9-Patch file ,然后在图片当中,左边界和上边界是当图片伸展时所延申的部分,右边界和下边界是其中内容所填充的部分。对于聊天中的气泡对话框,当然就需要使用9-Patch 文件了,我在这里也提供两个免抠素材:绿色的:↓↑这里还有一个白色的(右击,选择保存图片):↓↑带气泡的对话框添加依赖既然是对话框,...原创 2019-07-26 23:40:43 · 827 阅读 · 0 评论 -
Android >> 26. RecyclerView(三)— 添加点击事件
RecyclerView 需要我们自己给子项具体的View 去注册点击事件。首先我们知道,所有控件的最终类都是View,我们要对一个控件添加点击事件,我们就要获取到这个控件的View,修改适配器代码:static class ViewHolder extends RecyclerView.ViewHolder{ View fruitView; ImageView fruitIm...原创 2019-07-26 11:31:54 · 297 阅读 · 0 评论 -
Android >> 26. RecyclerView(二)— 实现横向滚动和瀑布流布局
首先在Android >> 26. RecyclerView(一)中,我们实现了RecyclerView 的基本使用,现在讲讲如何实现横向滚动和瀑布流布局横向滚动首先将Item 子项的布局设为垂直排列(图片在上文字在下)便于查看<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ...原创 2019-07-26 11:04:55 · 761 阅读 · 0 评论 -
Android >> 26. RecyclerView(一)
定义Item 子项的内容和布局先新建一个类,用于描述一个Item 的内部信息:public class Fruit{ private String name; private int imageId; public Fruit(String name, int imageId){ this.name = name; this.image...原创 2019-07-26 10:19:04 · 417 阅读 · 1 评论 -
Android >> 25. ProgressBar \ AlertDialog \ ProgressDialog
ProgressBarProgressBar 就是这个用于等待加载资源的控件所有的安卓控件都具有三个属性:findViewById(R.id.progressBar).setVisibility(View.GONE);findViewById(R.id.progressBar).setVisibility(View.INVISIBLE);findViewById(R.id.progre...原创 2019-07-25 19:41:34 · 176 阅读 · 0 评论 -
Android >> 24. 向另一个Activity 传递数据
向下一个Activity 传递数据传递数据使用putExtra() 方法:String data = "Hello";Intent intent = new Intent(MainActivity.this, NextActivity.class);intent.putExtra("extra_data", data);startActivity(intent);putExtra(...原创 2019-07-25 00:04:35 · 217 阅读 · 0 评论 -
Android >> 23. Menu 的使用
在res 目录下新建一个名为menu 的文件夹,然后在menu 文件夹下再新建一个名为main 的菜单文件(Menu resource file)然后在main.xml 文件中添加两个菜单项:<item android:id="@+id/add_item" android:title="Add"/><item android:id="@+id/re...原创 2019-07-24 22:31:06 · 194 阅读 · 0 评论