
禁用Popover点击黑色背景后关闭的功能实现
在项目中经常需要写一些通知弹出窗,这时就会经常使用到Popover组件。有时候制作一些弹出窗时,我做到只有用户点击了“确定”或者其他按钮时才会关闭,这个时候我就得想办法禁用其自带的“点击黑色背景后会关闭Popover”的这个功能。
通过阅读源码我找到了点击黑色背景关闭Popover的代码位置:
/**
* Popovers
* @param {type} $
* @param {type} window
* @param {type} document
* @param {type} name
* @param {type} undefined
* @returns {undefined}
*/
(function($, window, document, name) {
……
var backdrop = (function() {
var element = document.createElement('div');
element.classList.add(CLASS_BACKDROP);
element.addEventListener($.EVENT_MOVE, $.preventDefault);
element.addEventListener('tap', function(e) {
var popover = $.targets._popover;
if (popover) {
popover.addEventListener('webkitTransitionEnd', onPopoverHidden);
popover.classList.remove(CLASS_ACTIVE);
removeBackdrop(popover);
document.body.setAttribute('style', ''); //webkitTransitionEnd有时候不触发?
}
});
return element;
}());
有没有看到,在tap事件的侦听函数中做了Popover关闭的动作,此时我们若想要通过一个开关变量来控制其“自动关闭”功能的开启与关闭的话就像我一样加上如下一句代码:
element.addEventListener('tap', function(e) {
var popover = $.targets._popover;
if (popover) {
if(popover.getAttribute('data-disable-auto-close'))return;//added by S_eVent 阻止点击遮罩关闭弹窗
popover.addEventListener('webkitTransitionEnd', onPopoverHidden);
popover.classList.remove(CLASS_ACTIVE);
removeBackdrop(popover);
document.body.setAttribute('style', ''); //webkitTransitionEnd有时候不触发?
}
});
这样的话我们就通过一个“data-disable-auto-close”属性来控制Popover自动关闭功能的开关了,比如我有如下一个Popover准备弹出
<div class="mui-popover">弹出窗口</div>
那么给它加上data-disable-auto-close属性就能控制其黑色背景在点击后不会关闭Popover了
<div class="mui-popover" data-disable-auto-close=“true”>弹出窗口</div>
在项目中经常需要写一些通知弹出窗,这时就会经常使用到Popover组件。有时候制作一些弹出窗时,我做到只有用户点击了“确定”或者其他按钮时才会关闭,这个时候我就得想办法禁用其自带的“点击黑色背景后会关闭Popover”的这个功能。
通过阅读源码我找到了点击黑色背景关闭Popover的代码位置:
/**
* Popovers
* @param {type} $
* @param {type} window
* @param {type} document
* @param {type} name
* @param {type} undefined
* @returns {undefined}
*/
(function($, window, document, name) {
……
var backdrop = (function() {
var element = document.createElement('div');
element.classList.add(CLASS_BACKDROP);
element.addEventListener($.EVENT_MOVE, $.preventDefault);
element.addEventListener('tap', function(e) {
var popover = $.targets._popover;
if (popover) {
popover.addEventListener('webkitTransitionEnd', onPopoverHidden);
popover.classList.remove(CLASS_ACTIVE);
removeBackdrop(popover);
document.body.setAttribute('style', ''); //webkitTransitionEnd有时候不触发?
}
});
return element;
}());
有没有看到,在tap事件的侦听函数中做了Popover关闭的动作,此时我们若想要通过一个开关变量来控制其“自动关闭”功能的开启与关闭的话就像我一样加上如下一句代码:
element.addEventListener('tap', function(e) {
var popover = $.targets._popover;
if (popover) {
if(popover.getAttribute('data-disable-auto-close'))return;//added by S_eVent 阻止点击遮罩关闭弹窗
popover.addEventListener('webkitTransitionEnd', onPopoverHidden);
popover.classList.remove(CLASS_ACTIVE);
removeBackdrop(popover);
document.body.setAttribute('style', ''); //webkitTransitionEnd有时候不触发?
}
});
这样的话我们就通过一个“data-disable-auto-close”属性来控制Popover自动关闭功能的开关了,比如我有如下一个Popover准备弹出
<div class="mui-popover">弹出窗口</div>
那么给它加上data-disable-auto-close属性就能控制其黑色背景在点击后不会关闭Popover了
<div class="mui-popover" data-disable-auto-close=“true”>弹出窗口</div>
收起阅读 »

php前端
岗位职责:
1、控制开发产品质量,参与制定开发规范;
2、良好的代码书写、诠释和单元测试习惯,能写高质量的代码,对自己开发的代码负责;
3、开展具体功能的需求收集与分析工作,并按照规范编写项目需求文档;
4、可以掌控项目中某一模块的功能设计工作。辅助项目经理安排开发计划,分配人员工作:
5、编写模块核心API代码,指导初级程序功能性编码工作;
6、协助高级程序员进行代码审核;
岗位要求:
1、计算机相关专业;
2、2年以上PHP开发经验,必须有项目独立开发能力;
3、熟悉LAMP,熟悉使用MySQL数据库Linux下的PHP环境配置和应用,简便的Web开发语言;
4、掌握常规数据结构和算法;
5、良好的团队合作及主动性,能高质量的完成任务;
6、熟悉PHP常见框架的使用,了解其主要的优缺点;
7、可以按照业务需求进行功能设计;
8、良好学习能力沟通能力与需求收集能力,热爱编程工作,具备良好的责任心;
地址:温州市鹿城区新城大道发展大厦10楼1001室
薪资:4000--8000
联系电话:15067801161
得一(http://www.de1yg.com)
公司简介:
你想和帅哥美女一起工作吗?
你想和一群快乐的小伙伴一起工作吗?
你想在工作中找快乐吗?
那么如果你有足够的信心,加入我们得一团队吧
岗位职责:
1、控制开发产品质量,参与制定开发规范;
2、良好的代码书写、诠释和单元测试习惯,能写高质量的代码,对自己开发的代码负责;
3、开展具体功能的需求收集与分析工作,并按照规范编写项目需求文档;
4、可以掌控项目中某一模块的功能设计工作。辅助项目经理安排开发计划,分配人员工作:
5、编写模块核心API代码,指导初级程序功能性编码工作;
6、协助高级程序员进行代码审核;
岗位要求:
1、计算机相关专业;
2、2年以上PHP开发经验,必须有项目独立开发能力;
3、熟悉LAMP,熟悉使用MySQL数据库Linux下的PHP环境配置和应用,简便的Web开发语言;
4、掌握常规数据结构和算法;
5、良好的团队合作及主动性,能高质量的完成任务;
6、熟悉PHP常见框架的使用,了解其主要的优缺点;
7、可以按照业务需求进行功能设计;
8、良好学习能力沟通能力与需求收集能力,热爱编程工作,具备良好的责任心;
地址:温州市鹿城区新城大道发展大厦10楼1001室
薪资:4000--8000
联系电话:15067801161
得一(http://www.de1yg.com)
公司简介:
你想和帅哥美女一起工作吗?
你想和一群快乐的小伙伴一起工作吗?
你想在工作中找快乐吗?
那么如果你有足够的信心,加入我们得一团队吧

基础知识+实战训练,新手如何轻松学会使用HBuilder实现App快速开发
HBuilder目前无疑是最火的跨平台APP开发工具了。
相信很多开发者都已经享受到了这技术带给大家的愉悦和快感。
东翌学院是国内第一跨平台app开发培训机构,是国内跨平台app开发的先行者,我们对市面上的主流框架进行了深度的开发测试发现很多框架并不能达到我们的教学标准和开发出来一个完整的商业项目,但是Dcloud开发的app可以在我们买的千元内的测试机上非常流畅的运行,所以针对大家的对比,如果说你只是开发一个app放到自己手机上玩儿那任意框架都可以,前提需要保证你的手机配置要足够高,但是如果你要真正深入学习跨平台这个技术或者开发商业项目,那就要重新选择了!
我们的培训是app开发整套的课程更多是基础 、js、php、Mysql,从UI的设计到手机底层到后台的开发到数据库的管理,从一个创意的萌生到APP的上架,就算是0基础的学员也能够轻松开发出属于自己的APP,我们培训的是能够独立开发app的全栈工程师!
了解更多加Q:2547209832 tel:17090057032
HBuilder目前无疑是最火的跨平台APP开发工具了。
相信很多开发者都已经享受到了这技术带给大家的愉悦和快感。
东翌学院是国内第一跨平台app开发培训机构,是国内跨平台app开发的先行者,我们对市面上的主流框架进行了深度的开发测试发现很多框架并不能达到我们的教学标准和开发出来一个完整的商业项目,但是Dcloud开发的app可以在我们买的千元内的测试机上非常流畅的运行,所以针对大家的对比,如果说你只是开发一个app放到自己手机上玩儿那任意框架都可以,前提需要保证你的手机配置要足够高,但是如果你要真正深入学习跨平台这个技术或者开发商业项目,那就要重新选择了!
我们的培训是app开发整套的课程更多是基础 、js、php、Mysql,从UI的设计到手机底层到后台的开发到数据库的管理,从一个创意的萌生到APP的上架,就算是0基础的学员也能够轻松开发出属于自己的APP,我们培训的是能够独立开发app的全栈工程师!
了解更多加Q:2547209832 tel:17090057032
收起阅读 »

iOS切换到后台支持获取位置信息功能
此文档不再维护,请参考新文档地址:https://uniapp.dcloud.io/tutorial/app-ios-uibackgroundmodes
HBuilderX默认生成的应用在iOS是不支持后台运行,当应用切换到后台时应用停止运行,下次切换到前台继续运行。
如果要支持应用切换到后台后继续运行获取位置需要进行额外配置参数操作。
可视化配置
打开项目的manifest.json文件,在“(App)常用其它设置”项的“iOS设置”下“后台运行能力”的输入框中填入location

如果可视化界面中没有此项配置,请参考下面“源码视图配置”。
注意:如果提示“暂不支持数组格式的查看和修改,请在源码视图中查看和修改”,说应用之前通过源码视图配置过,请参考下面源码视图配置
源码视图配置
打开项目的manifest.json文件,选择“源码视图”项
- 5+ App项目
在 "plus" -> "distribute" -> "apple" 下添加 "UIBackgroundModes"字段 - uni-app项目
在 "app-plus" -> "distribute" -> "ios" 下添加 "UIBackgroundModes"字段
UIBackgroundModes字段值为字符串数组类型,输入location表示支持后台定位:
// ...
"UIBackgroundModes": ["location"],
// ...
如果需要同时支持后台定位和后台播放音乐,UIBackgroundModes字段值可配置为["audio","location"]
注意事项
在应用切换到后台之前需要调用监听位置变化API(plus.geolocation.watchPosition):
并且设置开启 'enableHighAccuracy ': true
关闭地址解析 'geocode': false
// ...
var watchId = plus.geolocation.watchPosition( function ( p ) {
console.log( "监听位置变化信息:" );
console.log( JSON.stringify(p) );
}, function ( e ) {
console.log( "监听位置变化信息失败:"+e.message );
}, {'enableHighAccuracy':true,'geocode': false} );
// ...
注意:真机运行不支持此功能,需要提交到打App云端打包才生效
应用切换到后台持续时,需要避免调用同步5+ API(调用直接返回数据的API),在后台运行时此类API将无法同步返回数据
此文档不再维护,请参考新文档地址:https://uniapp.dcloud.io/tutorial/app-ios-uibackgroundmodes
HBuilderX默认生成的应用在iOS是不支持后台运行,当应用切换到后台时应用停止运行,下次切换到前台继续运行。
如果要支持应用切换到后台后继续运行获取位置需要进行额外配置参数操作。
可视化配置
打开项目的manifest.json文件,在“(App)常用其它设置”项的“iOS设置”下“后台运行能力”的输入框中填入location
如果可视化界面中没有此项配置,请参考下面“源码视图配置”。
注意:如果提示“暂不支持数组格式的查看和修改,请在源码视图中查看和修改”,说应用之前通过源码视图配置过,请参考下面源码视图配置
源码视图配置
打开项目的manifest.json文件,选择“源码视图”项
- 5+ App项目
在 "plus" -> "distribute" -> "apple" 下添加 "UIBackgroundModes"字段 - uni-app项目
在 "app-plus" -> "distribute" -> "ios" 下添加 "UIBackgroundModes"字段
UIBackgroundModes字段值为字符串数组类型,输入location表示支持后台定位:
// ...
"UIBackgroundModes": ["location"],
// ...
如果需要同时支持后台定位和后台播放音乐,UIBackgroundModes字段值可配置为["audio","location"]
注意事项
在应用切换到后台之前需要调用监听位置变化API(plus.geolocation.watchPosition):
并且设置开启 'enableHighAccuracy ': true
关闭地址解析 'geocode': false
// ...
var watchId = plus.geolocation.watchPosition( function ( p ) {
console.log( "监听位置变化信息:" );
console.log( JSON.stringify(p) );
}, function ( e ) {
console.log( "监听位置变化信息失败:"+e.message );
}, {'enableHighAccuracy':true,'geocode': false} );
// ...
注意:真机运行不支持此功能,需要提交到打App云端打包才生效
应用切换到后台持续时,需要避免调用同步5+ API(调用直接返回数据的API),在后台运行时此类API将无法同步返回数据
iOS切换到后台支持音乐播放功能
iOS更多后台能力可参考苹果官方文档

想学习跨平台app开发的童鞋点进来,MUI全套课程
东翌学院是Dcloud权威合作培训机构!暑期来临之际,福利来袭!东翌学院在腾讯课堂联合分期乐推出0首付入学计划,跨平台app开发vip专业课程,最多可分12期,帮助你飞速实现跨平台app开发0费用入学学习的梦想!
详情请咨询:薇薇老师QQ410355878. 手机:13810930980
东翌学院创办于2011年,所属HTML5中国产业联盟企业,专注IT互联网职业教育,借助HTML5中国产业联盟和自身团队技术力量,Dcloud权威合作培训机构!在国内首推跨平台APP开发专业培训课程,腾讯课堂网络教育平台授课,线上学习全国就业。有实力、有信誉,要培训就选专业技术型培训机构!暑期班马上就开课了,国内首推零基础到实战开发APP,小班授课,直播教学,学跨平台App开发就在这里>>>立即学习
获得更多学习资料,报名试听请联系老师QQ410355878.
东翌学院是Dcloud权威合作培训机构!暑期来临之际,福利来袭!东翌学院在腾讯课堂联合分期乐推出0首付入学计划,跨平台app开发vip专业课程,最多可分12期,帮助你飞速实现跨平台app开发0费用入学学习的梦想!
详情请咨询:薇薇老师QQ410355878. 手机:13810930980
东翌学院创办于2011年,所属HTML5中国产业联盟企业,专注IT互联网职业教育,借助HTML5中国产业联盟和自身团队技术力量,Dcloud权威合作培训机构!在国内首推跨平台APP开发专业培训课程,腾讯课堂网络教育平台授课,线上学习全国就业。有实力、有信誉,要培训就选专业技术型培训机构!暑期班马上就开课了,国内首推零基础到实战开发APP,小班授课,直播教学,学跨平台App开发就在这里>>>立即学习
获得更多学习资料,报名试听请联系老师QQ410355878.
收起阅读 »
HBuilder中Autoprefixer的配置方法
Autoprefixer是一个后处理程序,不象Sass以及Stylus之类的预处理器。它适用于普通的CSS,可以实现css3代码自动补全。也可以轻松跟Sass,LESS及Stylus集成,在CSS编译前或编译后运行。详情见,https://github.com/postcss/autoprefixer
关于Autoprefixer
当Autoprefixer添加前缀到你的CSS,还不会忘记修复语法差异。这种方式,CSS是基于最新W3C规范产生:
a {
background : linear-gradient(to top, black, white);
display : flex
}
::placeholder {
color : #ccc
}
编译成:
a {
background : -webkit-linear-gradient(bottom, black, white);
background : linear-gradient(to top, black, white);
display : -webkit-box;
display : -webkit-flex;
display : -moz-box;
display : -ms-flexbox;
display : flex
}
:-ms-input-placeholder {
color : #ccc
}
::-moz-placeholder {
color : #ccc
}
::-webkit-input-placeholder {
color : #ccc
}
::placeholder {
color : #ccc
}
Autoprefixer 同样会清理过期的前缀,因此下面的代码:
a {
-webkit-border-radius : 5px;
border-radius : 5px
}
编译成:
a {
border-radius : 5px
}
因为经过Autoprefixer处理,CSS将仅包含实际的浏览器前缀。
安装node.js
(略)
安装Autoprefixer,
见https://github.com/postcss/autoprefixer:
npm install autoprefixer -g
mac下可能需要加sudo,或者是不是全局安装(-g)那就看你自己的环境了。
如npm太慢,可使用 NPM 镜像的https://npm.taobao.org/
安装postcss-cli
Autoprefixer其实是postcss的插件,见https://github.com/code42day/postcss-cli
npm install postcss-cli -g
配置外部工具
打开HBuilder,运行-外部工具-外部工具配置,如图:
新建一个外部工具配置
名称填写autoprefixer(这个随意,就是起个名字)
要执行的命令或文件填写npm安装目录\postcss.cmd(mac下应为npm安装目录\postcss)如
C:\Users\wu\AppData\Roaming\npm\postcss.cmd
工作目录填写${project_loc}
参数填写-u autoprefixer -o ${resource_loc} ${resource_loc}
然后点击应用,如下图
使用autoprefixer
点击你的css、sass文件,然后右键,依次点击外部工具-autoprefixer(此处为你新建外部工具的名称)等待编译,编译完毕即可
配置快捷键
工具-选项-常规-快捷键,搜索autoprefixer(此处为你新建外部工具的名称),设置快捷键即可
Autoprefixer是一个后处理程序,不象Sass以及Stylus之类的预处理器。它适用于普通的CSS,可以实现css3代码自动补全。也可以轻松跟Sass,LESS及Stylus集成,在CSS编译前或编译后运行。详情见,https://github.com/postcss/autoprefixer
关于Autoprefixer
当Autoprefixer添加前缀到你的CSS,还不会忘记修复语法差异。这种方式,CSS是基于最新W3C规范产生:
a {
background : linear-gradient(to top, black, white);
display : flex
}
::placeholder {
color : #ccc
}
编译成:
a {
background : -webkit-linear-gradient(bottom, black, white);
background : linear-gradient(to top, black, white);
display : -webkit-box;
display : -webkit-flex;
display : -moz-box;
display : -ms-flexbox;
display : flex
}
:-ms-input-placeholder {
color : #ccc
}
::-moz-placeholder {
color : #ccc
}
::-webkit-input-placeholder {
color : #ccc
}
::placeholder {
color : #ccc
}
Autoprefixer 同样会清理过期的前缀,因此下面的代码:
a {
-webkit-border-radius : 5px;
border-radius : 5px
}
编译成:
a {
border-radius : 5px
}
因为经过Autoprefixer处理,CSS将仅包含实际的浏览器前缀。
安装node.js
(略)
安装Autoprefixer,
见https://github.com/postcss/autoprefixer:
npm install autoprefixer -g
mac下可能需要加sudo,或者是不是全局安装(-g)那就看你自己的环境了。
如npm太慢,可使用 NPM 镜像的https://npm.taobao.org/
安装postcss-cli
Autoprefixer其实是postcss的插件,见https://github.com/code42day/postcss-cli
npm install postcss-cli -g
配置外部工具
打开HBuilder,运行-外部工具-外部工具配置,如图:
新建一个外部工具配置
名称填写autoprefixer(这个随意,就是起个名字)
要执行的命令或文件填写npm安装目录\postcss.cmd(mac下应为npm安装目录\postcss)如
C:\Users\wu\AppData\Roaming\npm\postcss.cmd
工作目录填写${project_loc}
参数填写-u autoprefixer -o ${resource_loc} ${resource_loc}
然后点击应用,如下图
使用autoprefixer
点击你的css、sass文件,然后右键,依次点击外部工具-autoprefixer(此处为你新建外部工具的名称)等待编译,编译完毕即可
配置快捷键
工具-选项-常规-快捷键,搜索autoprefixer(此处为你新建外部工具的名称),设置快捷键即可
收起阅读 »
跨平台APP开发零基础入门必学课程
东翌学院创办于2011年,所属HTML5中国产业联盟企业,专注IT互联网职业教育,借助HTML5中国产业联盟和自身团队技术力量,Dcloud权威合作培训机构!在国内首推跨平台APP开发专业培训课程,腾讯课堂网络教育平台授课,线上学习全国就业。有实力、有信誉,要培训就选专业技术型培训机构!暑期班马上就开课了,国内首推零基础到实战开发APP,小班授课,直播教学,学跨平台App开发就在这里>>>
东翌学院创办于2011年,所属HTML5中国产业联盟企业,专注IT互联网职业教育,借助HTML5中国产业联盟和自身团队技术力量,Dcloud权威合作培训机构!在国内首推跨平台APP开发专业培训课程,腾讯课堂网络教育平台授课,线上学习全国就业。有实力、有信誉,要培训就选专业技术型培训机构!暑期班马上就开课了,国内首推零基础到实战开发APP,小班授课,直播教学,学跨平台App开发就在这里>>>
收起阅读 »
Android开机自启应用
问题场景
最近开发一个展示类应用项目,展示设备为若干个24小时运行的Android广告机。考虑到停电的情况该应用需要开机自启动。
背景知识
-
当Android启动时,会发出一个系统广播,内容为ACTION_BOOT_COMPLETED,它的字符串常量表示为 android.intent.action.BOOT_COMPLETED。
-
android开发中的基本概念:Activity。Activity简单的理解为android的视图,承载着android的人机交互。一个应用程序可以有多个Activity,其中有一个Activity为应用程序启动时最先启动的。 该Activity在AndroidManifest.xml中的具体形式如下。intent-filter中两项android.intent.action.MAIN 和 android.intent.category.LAUNCHER表示该activity为应用程序启动主界面。
<activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
到这里解决问题的思路就完整了,我们监听ACTION_BOOT_COMPLETED广播,并在监听逻辑中启动应用的对应的Main Activity。
前提条件
由于我们需要自己写广播接收逻辑,所以应用的打包只能采用“离线打包”,这样我们才能调用android原生的api。
示例
-
本地离线打包项目导入,环境配置。(略,请参考 Android离线打包)
-
AndroidMainfest.xml中添加开机启动权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
-
创建一个广播接收类
package io.dcloud.yourapp;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import io.dcloud.PandoraEntry;
public class BootBroadcastReceiver extends BroadcastReceiver {
static final String action_boot="android.intent.action.BOOT_COMPLETED";
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(action_boot)){
// 注意H5+SDK的Main Activity为PandoraEntry(见AndroidMainfest.xml)
Intent bootMainIntent = new Intent(context, PandoraEntry.class);
// 这里必须为FLAG_ACTIVITY_NEW_TASK
bootMainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(bootMainIntent);
}
}
}
- 在AndroidMainfest.xml中注册该广播接收类
<!--开机自启动--> <receiver android:name=".BootBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <category android:name="android.intent.category.LAUNCHER"></category> </intent-filter> </receiver>
- 编译,调试
注意事项
-
请注意BootBroadcastReceiver的命名空间,要保证AndroidMainfest.xml中receiver可以找的到我们创建的BootBroadcastReceiver类。
-
应用程序必须在Android中启动一次,下次才可以开机启动。
问题场景
最近开发一个展示类应用项目,展示设备为若干个24小时运行的Android广告机。考虑到停电的情况该应用需要开机自启动。
背景知识
-
当Android启动时,会发出一个系统广播,内容为ACTION_BOOT_COMPLETED,它的字符串常量表示为 android.intent.action.BOOT_COMPLETED。
-
android开发中的基本概念:Activity。Activity简单的理解为android的视图,承载着android的人机交互。一个应用程序可以有多个Activity,其中有一个Activity为应用程序启动时最先启动的。 该Activity在AndroidManifest.xml中的具体形式如下。intent-filter中两项android.intent.action.MAIN 和 android.intent.category.LAUNCHER表示该activity为应用程序启动主界面。
<activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
到这里解决问题的思路就完整了,我们监听ACTION_BOOT_COMPLETED广播,并在监听逻辑中启动应用的对应的Main Activity。
前提条件
由于我们需要自己写广播接收逻辑,所以应用的打包只能采用“离线打包”,这样我们才能调用android原生的api。
示例
-
本地离线打包项目导入,环境配置。(略,请参考 Android离线打包)
-
AndroidMainfest.xml中添加开机启动权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
-
创建一个广播接收类
package io.dcloud.yourapp;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import io.dcloud.PandoraEntry;
public class BootBroadcastReceiver extends BroadcastReceiver {
static final String action_boot="android.intent.action.BOOT_COMPLETED";
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(action_boot)){
// 注意H5+SDK的Main Activity为PandoraEntry(见AndroidMainfest.xml)
Intent bootMainIntent = new Intent(context, PandoraEntry.class);
// 这里必须为FLAG_ACTIVITY_NEW_TASK
bootMainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(bootMainIntent);
}
}
}
- 在AndroidMainfest.xml中注册该广播接收类
<!--开机自启动--> <receiver android:name=".BootBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <category android:name="android.intent.category.LAUNCHER"></category> </intent-filter> </receiver>
- 编译,调试
注意事项
-
请注意BootBroadcastReceiver的命名空间,要保证AndroidMainfest.xml中receiver可以找的到我们创建的BootBroadcastReceiver类。
-
应用程序必须在Android中启动一次,下次才可以开机启动。

使用选项卡+下拉刷新的种种问题
app主页预加载是个页面,分别为a,b,c,d目录的index,也就是a/index.html ; b/index.html ......
其中主页面有个点击事件是获取商家id并传到b目录下的商家产品目录页(这个页面是选项卡+下拉刷新),麻烦来了,传过来的值接收到并把数据封装好了,但弄死就是不显示内容,但是比较奇怪的是,在b目录(产品目录了)点击进入产品详细,里面有个点击事件进入商家店铺页面(也就上面提到的商家产品目录),这下数据能显示,就那么奇怪~~~
在商家产品目录里更奇怪,选项卡+下拉刷新 都知道是什么页面结构,上面产品分类,下面是产品分类列表,如果首次不点击产品分类的话,在下面左右滑动,产品分类选项卡不跟随走,并提示【 Uncaught TypeError: Cannot read property '0' of undefined at js/mui.min.js:7】,这个先不管吗,毕竟可以再次点击产品分类后再左右滑动 就不会提示错误。
但是上下滑动 有出问题了,远程获得数据,啥都可以,就是不显示数据
var createFragment = function(ul, index,itemid) {
var length = ul.querySelectorAll('li').length;
var fragment = document.createDocumentFragment();
var li;
loaddatelist.usershoplist(length,id,itemid, function(rs) {
if(rs){
var len=rs.length;
for (var ii = 0; ii < len; ii++) {
li = document.createElement('li');
li.className = 'mui-table-view-cell mui-media';
li.id =rs[ii]['id'];
li.innerHTML+='<img class="mui-media-object mui-pull-left" data-lazyload-id="'+rs[ii]['id']+'" src="'+rs[ii]['picurl']+'" onerror="src=\'../images/no_logo.png\'">';
li.innerHTML+='<div class="mui-media-body">'+rs[ii]['title'];
li.innerHTML+='<p class="mui-ellipsis-2">'+rs[ii]['description']+'</p>';
li.innerHTML+='<p><span class="mui-pull-left">¥'+rs[ii]['price']+'元</span><span class="mui-pull-right"><span class="mui-icon mui-icon-eye mygz"></span>'+rs[ii]['oncl']+'</span></p>';
li.innerHTML+='</div>';
fragment.appendChild(li);
}
}
});
return fragment;
};
然后把这个换成官方提供的demo,嘿,居然可以了,但数据不是想要的数据~~~
app主页预加载是个页面,分别为a,b,c,d目录的index,也就是a/index.html ; b/index.html ......
其中主页面有个点击事件是获取商家id并传到b目录下的商家产品目录页(这个页面是选项卡+下拉刷新),麻烦来了,传过来的值接收到并把数据封装好了,但弄死就是不显示内容,但是比较奇怪的是,在b目录(产品目录了)点击进入产品详细,里面有个点击事件进入商家店铺页面(也就上面提到的商家产品目录),这下数据能显示,就那么奇怪~~~
在商家产品目录里更奇怪,选项卡+下拉刷新 都知道是什么页面结构,上面产品分类,下面是产品分类列表,如果首次不点击产品分类的话,在下面左右滑动,产品分类选项卡不跟随走,并提示【 Uncaught TypeError: Cannot read property '0' of undefined at js/mui.min.js:7】,这个先不管吗,毕竟可以再次点击产品分类后再左右滑动 就不会提示错误。
但是上下滑动 有出问题了,远程获得数据,啥都可以,就是不显示数据
var createFragment = function(ul, index,itemid) {
var length = ul.querySelectorAll('li').length;
var fragment = document.createDocumentFragment();
var li;
loaddatelist.usershoplist(length,id,itemid, function(rs) {
if(rs){
var len=rs.length;
for (var ii = 0; ii < len; ii++) {
li = document.createElement('li');
li.className = 'mui-table-view-cell mui-media';
li.id =rs[ii]['id'];
li.innerHTML+='<img class="mui-media-object mui-pull-left" data-lazyload-id="'+rs[ii]['id']+'" src="'+rs[ii]['picurl']+'" onerror="src=\'../images/no_logo.png\'">';
li.innerHTML+='<div class="mui-media-body">'+rs[ii]['title'];
li.innerHTML+='<p class="mui-ellipsis-2">'+rs[ii]['description']+'</p>';
li.innerHTML+='<p><span class="mui-pull-left">¥'+rs[ii]['price']+'元</span><span class="mui-pull-right"><span class="mui-icon mui-icon-eye mygz"></span>'+rs[ii]['oncl']+'</span></p>';
li.innerHTML+='</div>';
fragment.appendChild(li);
}
}
});
return fragment;
};
然后把这个换成官方提供的demo,嘿,居然可以了,但数据不是想要的数据~~~
收起阅读 »