文章目录
Android
安卓开发者指南:https://developer.android.google.cn/guide
1 推送
1.1 概念
推送
使应用程序及时接收到由服务端主动发起的通知,或者消息的一种技术。
实现推送的方式
1.客户端定时轮询(落后)
2.客户端与服务器建立长连接(核心内容)
短连接:数据交互时,建立连接,数据交互完成后,连接关闭。(http请求)
长连接:客户端与服务器之间始终保持着一个通信连接。(除非手机关机、关网)
推送实现原理
大量第三方平台或工具来实现推送技术快速集成到APP中使用。
Android常用推送平台:
谷歌云通讯(GCM):限制访问
极光推送(jPush):即时通讯,开源利于使用,流量电量消耗少,集成简单,丰富的富媒体推送
友盟推送(UPush)
个推:主打推送
如何选择推送平台:文档是否完善;推送达到率(长连接的存活度,体现在各种不同品牌手机、设备)
1.2 极光推送JPush
官网查看:https://www.jiguang.cn/push
产品功能
1.多种消息类型:通知、自定义消息、富媒体
2.A / B测试:合理的推送能够激活用户,提高用户粘性,使用A/B分组测试的科学方法,根据测试反馈的结果,帮助开发者选择最优化的推送方案。
3.用户和推送统计
4.私有云定制:对于安全性要求更高,希望推送数据和系统存储在自己服务器的客户,及个性化需求需要定制开发的,性能更高要求的,或者想拥有自己推送平台的甚至要求源码授权二次开发的开发者。电商、企业、银行
5.短信补充:通过极光后台推送APP通知消息,对于一些重要又不能遗漏的信息可以调用极光短信的后台对未收到的客户端发送短信通知,保证消息的可靠性。
6.安全包(新增):为金融、新闻、政务及其他对推送安全要求极高的客户提供安全严谨、稳定可靠的信息推送解决方案。消息审核、消息撤回、黑词管理、避免重复发送
集成极光推送
1.注册极光账号
2.创建应用并开通推送功能
3.集成SDK
SDK集成
1.自动集成极光SDK:APPbuild中写入依赖,定制推送消息不可控
2.手动集成极光SDK
手动SDK集成
1.添加jar、so、资源文件
2.配置AndroidManifest,复制SDK配置在自己的文件中,包括res目录下的drawable、values
3.添加继承自BroadcastReceiver的类,可以从demo中复制过来
4.激活JPush插件
测试推送消息
1.进入极光平台,选择应用
2.点击发送通知功能
3.输入发送的通知消息,选择设备,点击发送
出现延迟:预估人数;接收也会有延迟;
预估人数为0,参考文章:https://blog.csdn.net/weixin_45044097/article/details/106803064
自定义消息与推送消息对比
相同点:都可以在receive中接收到回调;都可以区分用户发送;
不同点:自定义消息默认不会通过Notification展示,推送消息则不同。
自定义消息使用场景:
不希望消息被展示,只希望在app内使用消息的时候;自定义通知栏;需要条件的消息提醒(比如只在某一页面看到消息)
富媒体消息
◆可以在receive中接收到回调
◆可以区分用户发送
◆默认会通过Notification展示
A/B测试
通过对用户进行分组,发送不同的推送内容来测试什么样的内容更容易被用户点击
指定用户接收消息
◆别名
◆标签
通知携带数据
◆添加附加字段
◆获取数据: bundle.getString(JPushInterface. EXTRA_ EXTRA);
◆进行自定义操作
自定义通知栏样式
◆继承 CustomPushNotificationBuilder
◆定义通知栏样式
◆JPushInterface. setPushNotificationBuilder(Integer notificationBuilderId, BasicPushNotificationBuilder builder) 指定自定义的样式
总结
◆繁多的推送平台
◆极光推送通知的类型
◆筛选推送目标、通知携带数据
◆A/B测试
◆自定义通知栏
2 WebView
2.1 简介
WebView是Android中Ui组件的一种
WebView基于webkit内核 (Chromium)
作用:用来展示网页,并且与网页进行交互
网页基本组成
搭建本地的http-server
◆安装node环境:https://nodejs.org/zh-cn/
◆安装CNPM:npm install -g cnpm --registry=https://registry.npm.taobao.org
◆安装http-server:cnpm install http-server -g
2.2 加载网页的四种方式
◆loadUrI(String url):
直接加载一个网页进来,可以是网络地址、手机本地html、资源文件下的html页面。
◆loadUrl(String ur, Map <String, String> additionalHttpHeaders):
直接加载一个网页进来,但是他提供了一个可以让我们添加requestHeader的参数,在这里加入的集合会被添加到网页的requestHeader中。
◆loadData(String data, String mimeType, String encoding):
直接加载一段html文本,给他指定需要加载的html文本的内容、mime类型,和编码格式。注意:#、%、\、?这四种符号需要使用%23、%25、%27、%3f 的encode编码来替代。
◆loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)
基于一个基本的url,来加载一段html内容,并且我们可以给他指定一个浏览历史的地址,当我们从当前页面跳转出去之后,可以后退到这个浏览历史的地址中。
1.MainActivity
2.添加访问网络的权限< uses-permission android:name=“android.permission.INTERNET”/>
访问sd卡的权限< uses-permission android:name = “android.permission.WRITE_EXTERNAL_STORAGE”>
3.WebViewActivity
public class WebViewActivity extends AppCompatActivity {
private WebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_view);
mWebView = findViewById(R.id.webview);
// 方式一
// 1.加载网络网页,添加访问网络的权限
mWebView.loadUrl("http://www.baidu.com");
// 2.加载sd卡上面的本地网页,添加访问SD卡的权限
mWebView.loadUrl("file://"+Environment.getExternalStorageDirectory().getPath()+"/1/index.html");
// 3.加载本地资源文件下的网页
mWebView.loadUrl("file:///android_asset/index.html");
mWebView.setWebViewClient(new WebViewClient());
}
}
public class WebViewActivity extends AppCompatActivity {
private WebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_view);
mWebView = findViewById(R.id.webview);
// 方式二
// mWebView.loadUrl("http://192.168.1.100:3000");//本机服务
// 方式三
//mWebView.loadData("<h1>Hello WebView</h1>","text/html","utf-8");
// 方式四
mWebView.loadDataWithBaseURL("http://www.imooc.com","<img src=\"static/img/index/logo.png\"/>",
"html","utf-8","");// 最后一个参数是后退的历史URL
mWebView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
Map<String, String> reqHeaders = new HashMap<>();
reqHeaders.put("android-webview-demo","testReqHeaders");
mWebView.loadUrl("http://192.168.0.103:3000",reqHeaders);
return super.shouldOverrideUrlLoading(view, request);
}
});
}
}
2.3 WebView常用方法
2.3.1 控制网页的前进和后退
◆boolean canGoBack():当前页面是否可以后退
◆void goBack():后退网页
◆boolean canGoForward()
◆void goForward()
◆boolean canGoBackOrForward(int steps):以当前的index为起始点判断当前页面是否可以前进或者后退到历史记录中指定的steps,如果steps为负数则为后退,正数则为前进。
◆void goBackOrForward(int steps):以当前的index为起始点前进或者后退到历史记录中指定的steps,如果steps为负数则为后退,正数则为前进。
◆void clearHistory():清理webview的浏览历史。
2.3.2 WebView的状态管理
◆onPause():当页面被失去焦点被切换到后台不可见状态,需要执行onPause,通过onPause 动作通知内核暂停所有的动作,比如DOM的解析、plugin的执行、JavaScript执行。
◆onResume():激活WebView为活跃状态,能正常执行网页的响应。
◆pauseTimers():当应用程序(存在webview)被切换到后台时,这个方法不仅仅针对当前的webview而是全局的全应用程序的webview,它会暂停所有webview的layout,parsing,javascript。降低CPU功耗。
◆resumeTimers():恢复pauseTimers状态
◆destroy():销毁Webview,在关闭了Activiy时,如果不调用webview的destroy()方法,在activity关闭时, webview本身并不会被销毁,就会出现内存溢出的问题。
2.4 WebView的常用类
◆WebSettings:对webview进行配置和管理
◆WebViewClient:处理webview加载时的各种回调通知
◆WebChromeClient:辅助webview去处理JavaScript对话框、标题进度等。
2.4.1 WebSetting
作用:对webview进行配置和管理
具体用法:
- webview是否支持要访问的页面中JavaScript代码运行
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true); - webview是否支持缩放操作
webSettings.setSupportZoom(true):是否支持缩放,默认是true支持缩放功能;
webSettings.setBuiltInZoomControls(true):设置内置的缩放控件,若为true则该webview可缩放;
webSettings.setDisplayZoomControls(true):是否隐藏原生的缩放控件; - webview对网页的四种缓存策略:webSettings.setCacheMode(WebSettings.LOAD_CACHE_ONLY);
◆LOAD_CACHE_ONLY :永远不使用网络,只去本地缓存,没有缓存则不会加载
◆LOAD_CACHE_ELSE_NETWORK:只要本地有缓存,无论是否过期,都会去使用本地缓存,没有缓存才会去加载网络
◆LOAD_DEFAULT:(默认)根据cache-control决定是否从网络获取
◆LOAD_NO_CACHE:永远不使用缓存,只从网络获取
2.4.2 WebViewClient
作用:处理webview加载时的各种回调通知
当我们使用webview去打开网页的时候,默认使用android中自带的浏览器去打开,当在给webview添加了webviewClient之后,表示希望使用自己的webview去处理网页。
◆WebResourceResponse shouldInterceptRequest(WebView view, String url):进行资源请求的时候回调;还有一个方法的第二个参数是WebResourceRequest 只能在android5.0以上使用。
◆void onPageStarted(WebView view, String ur, Bitmap favicon):网页已经开始加载的时候回调
◆void onLoadResource(WebView view, String url):加载网页资源之前回调
◆void onPageFinished(WebView view, String url):网页加载完成的时候回调
◆boolean shouldOverrideUrlLoading(WebView view, String url):webview将要加载新的url时进行回调,还有一个方法的第二个参数是WebResourceRequest 只能在android7.0以上设备,API level 21。
在这个方法里面可以做地址拦截:
◆void onReceivedError(WebView view, int errorCode, String description, String failingUrl):网页访问发生错误的时候回调;另外一个方法在android6.0以上使用。可以使用view.loadUri("")给用户展示错误页面。
2.4.3 WebChromeClient
用回调方法处理网页中对话框、标题、进度等
◆void onProgressChanged(WebView view, int newProgress):获取网页加载进度
◆void onReceivedTitle(WebView view, String title):获取网页标题
◆boolean onJsAlert(WebView view, String url, String message, JsResult result):在网页将要打开一个alert警告对话框的时候回调
◆boolean onJsConfirm(WebView view, String url, String message, JsResult result):在网页将要打开一个confirm对话框的时候回调
◆boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result):在网页将要打开一个prompt对话框的时候回调
demo:
index.html
网页上用Toast打印消息:
2.5 Android与JS交互
2.5.1 Android去调用js代码
◆loadUrl(“javascript:方法名(‘参数’ ,… )”):无法方便的获取JS中的返回值(返回内容会替换网页所有包括的内容)
有一种解决方法就是用alert弹出返回值,然后用onJSAlert方法把结果拿到,Toast打印出来。
◆evaluateJavascript( javascript:方法名(’ 参数’ …),ValueCallback < String> resultCallback):方便的获取JS的返回值,需要android4.4(API 19)以上的版本
2.5.2 JS去调用Android代码
拦截JavaScript请求的回调方法:JS无法方便的获取android中的返回值,使用繁琐
◆监听webViewClient的shouldOverrideUrlLoading(WebView view, String url )方法
◆根据接受到的url参数去判断,在android中需要执行的内容
和前端规定:
获取android的返回值较为繁琐,android中去调用js的方法获取
对象映射:简单,容易获取返回值,在android4.2以下存在安全漏洞(通过反射获取)
◆通过WebView的addJavascriptInterface ( object,name )进行对象映射
◆通过@JavascriptInterface注解在映射类中声明需要被Js调用的方法
◆在JS中通过name.方法名()的方式来调用android的映射类中被@JavascriptInterface注解的方法
1.映射类
2.对象映射
mWebView.addJavascriptInterface(new DemoJsObject(),“android”);
3.页面添加标签,点击事件