[麻雀虽小]记 简易Markdown阅读器 开发全过程
[麻雀虽小]记 简易Markdown阅读器 开发全过程
序言
项目地址: https://github.com/didikee/MDReader
测试文章地址: 2017 Android 面试题 [ 基础与细节 ]
enjoy.
本文的程序比较简单,甚至说有些简陋,简陋到我连应用程序列表的图标都不想占用,只希望你在打开.md文件时不至于没有什么app可以查看,仅此而已。
整个思路我梳理下如下:
1. 程序名称
2. 程序功能 --> 这个很明确,只是一个可以查看`Markdown`格式文件。
3. 程序UI及其交互 (这个对于开发人员来说最麻烦,做出来的交互还可能反人类。。。)
4. 功能实现 (这个占用绝大部分时间,当然包括测试和写 Demo )
5. 程序Icon (这个没有UI帮忙,自己只能用些简单的,还好目前有不少工具可以用)
6. 差不多完成了第一个版本 (可用而已)
具体实现过程
1. 程序名称
我立马想起来的是MDReader,所以就是差个中文名字了,就叫Markdown阅读器好了,重名了就改MD阅读器好了。再重名再说吧。。。
2. 功能 与 UI
之前我按照Google的官方来,有一个DrawerLayout,但是立马就发现我要做的本来就是一个很简单明了的东西。如果我为了把抽屉填满内容也是可以,但是我自己都觉得很臃肿。然后我立马想到了一款App----RE文件浏览器,这个App从我刚接触Android时就是玩机的必备利器,而且功能从那时起就没有什么大的改动,只是在UI上跟着潮流在走,而且此APP在GooglePlay的售价和评分都挺高的。我想要的其实就是这种风格的APP,稳定简单易用。
所以,我擅做主张的把所有的UI都砍掉了!变成一个没有图标的工具服务型App。砍完发现确实简陋了,但是感觉挺好的,后期可能加一些CSS样式方便导出HTML文件。
3. 功能实现
这个就比较灵活了,我是花了一天半的时间的。Markdown to HTML,Google 这个关键字,信息还是挺多的,或者 GitHub 搜索一下 Markdown也能找到很多开源工具。但是大部分都是基于JavaScript的,我对这方面不是很熟悉,只能看看,会一些Android 与JavaScript 的交互而已。所以我更希望有为Android 量身做的开源库。
我试过的有:
1. commonmark : java写的,但是我使用时不支持表格
2. Markdownj: 也是java 写的
3. MarkdownView-Android: 拓展不太好,或者没发拿来直接用,而且他是用的 marked 这个开源库
4. us.feras.mdv:markdownview: 问题多多,直接放弃
5. marked: 这个看起来很不错,我借用Webview 用执行JavaScript 方法,然后把解析后的html 回传给 Android。路是通的,但是有一些问题。
6. markedj: 基于 marked.js 写的,用起来可以就没换了,推荐。
4. 程序图标Icon
虽然我在程序列表里不显示,但是在用户点击一个.md格式的文本后,我的app需要匹配到,并且显示在匹配的列表里,此时还是需要icon,Android 默认的icon看着也太寒碜了。然后我就写了两个字MD,嗯,Icon也算是做完了,哈哈。

感谢这个在线工具,有兴趣的可以收藏mark下:https://jgilfelt.github.io/AndroidAssetStudio/icons-launcher.html
市场
后期上线的话,可能只会去酷市场和GooglePlay了,当然,上线也只是为了分享而已。
具体实现[代码篇]
1. maven 如何在Android 中使用
例如,markedj作者给出了maven仓库的pom.xml文件:
<dependencies>
<dependency>
<groupId>io.github.gitbucket</groupId>
<artifactId>markedj</artifactId>
<version>1.0.9</version>
</dependency>
</dependencies>
在 Android 中只需要把这三个参数用 :连接起来就好了,这就是 Gradle可以用的:
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
// markdej,base on marked.js
compile 'io.github.gitbucket:markedj:1.0.9'
compile 'com.android.support:support-annotations:25.1.1'
}
2. 加入CSS样式
<style> ##你的样式##</style>
我使用的是MarkdownPad2 的默认css样式。
样式的代码比较长,我就不贴了,可以去本文顶部的连接查看项目。
3. markdown 转 html
这个都说忘记了,这个耗时最长,但是耗时越长说的就最少了,绝大部分时间都是测试,反复的看,对比生成的html文件。
目前APP 依赖的Android Webview去展示 html,但是部分手机会出现问题,比如我的OPPO测试机就不能代码块左右滑动,导致显示不全。
此时你可以用手机里的浏览器打开生成的html文件,应该不会出现上述问题。
4. 匹配 .md 格式文件
我的唯一一个 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"/>
<data android:host="ruijun.com" android:scheme="http"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="file"/>
<data android:host="*"/>
<data android:mimeType="*/*"/>
<data android:pathPattern=".*\\.md"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="file"/>
<data android:host="*"/>
<data android:mimeType="*/*"/>
<data android:pathPattern=".*\\.markdown"/>
</intent-filter>
</activity>
5. 隐藏程序图标
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<data android:host="ruijun.com" android:scheme="http"/>
</intent-filter>
只需要这句最关键的:<data android:host="ruijun.com" android:scheme="http"/>
源码里的关键点在LoaderTask.loadAllAppsByBatch()方法和Launcher.bindAllApplications()方法。
参考:隐藏APP图标
6. 得到 Intent 里的文件路径
这里面只是版本的问题,不同的品牌手机也会有影响
public static String getPathFromUri(Context context, Uri uri) {
//得到uri,后面就是将uri转化成file的过程
if (context == null || uri == null) {
return null;
}
String pathFromUri;
int sdkInt = Build.VERSION.SDK_INT;
if (sdkInt >= 19) {
pathFromUri = Uri2Path.getRealPathFromURI_API19(context, uri);
} else if (sdkInt >= 11 && sdkInt < 19) {
pathFromUri = Uri2Path.getRealPathFromURI_API11to18(context, uri);
} else {
pathFromUri = Uri2Path.getRealPathFromURI_BelowAPI11(context, uri);
}
return pathFromUri;
}
总结
放张截图吧

[麻雀虽小]记 简易Markdown阅读器 开发全过程的更多相关文章
- C#版简易RSS阅读器
C#版简易RSS阅读器.由VB版修改完成,感谢aowind的技术支持! 源代码: using System; using System.Drawing; using System.Collection ...
- android rss阅读器开发一点小技巧
这几天一直在学习开发Rss阅读器,遇到一个很坑的问题,InputSource这里总是出错.弄了好久,终于让我找到一个解决方法----看代码: new Thread(){ @Override publi ...
- pdf阅读器开发
文章基于sumatrapdf的实现(当中mupdf中的内容不会太多涉及).以及自己在此基础上做的 优化,扩展.详细效果能够參考百度阅读器精简版. 最NB的还是得属于foxit.渲染速度一流,展示大图片 ...
- 使用multiprocessing解决PyMuPDF不支持多线程加载导致的界面卡死无响应问题,及一个PyQt5实现的简易PDF阅读器例子
最近在用PyMuPDF实现一个PDF阅读器,发现PyMuPDF在加载某些epub时耗时非常长,有的长达10几秒,会导致界面卡死无响应. 尝试用多线程后台加载,发现还是不能解决问题,和作者交流(issu ...
- 手机新闻网站,手持移动新闻,手机报client,jQuery Mobile手机新闻网站,手机新闻网站demo,新闻阅读器开发
我们坐在地铁.经常拿出新浪手机查看新闻.腾讯新闻,或者看新闻,等刷微信功能.你有没有想过如何实现这些目标. 移动互联网.更活泼. 由于HTML5未来,jQuery Moblie未来. 今天我用jqm的 ...
- 手机新闻网站,掌上移动新闻,手机报client,jQuery Mobile手机新闻网站,手机新闻网站demo,新闻阅读器开发
我们坐在地铁,经常来查看新浪手机新闻,腾讯新闻.或者刷微信看新闻更多功能.你有没有想过如何实现这些目标.移动互联网,更活泼. 因为HTML5到,jQuery Moblie到.今天我用jqm为了给你一个 ...
- 【应用】Markdown 在线阅读器
前言 一款在线的 Markdown 阅读器,主要用来展示 Markdown 内容.支持 HTML 导出,同时可以方便的添加扩展功能.在这个阅读器的基础又做了一款在线 Github Pages 页面生成 ...
- 采用WPF技术,开发OFD电子文档阅读器
前言 OFD是国家标准版式文档格式,于2016年生效.OFD文档国家标准参见<电子文件存储与交换格式版式文档>.既然是国家标准,OFD随后肯定会首先在政务系统使用,并逐步推向社会各个方面. ...
- OFD电子文档阅读器功能说明(采用WPF开发,永久免费)
特别说明 ofd阅读器开发语言为c#,具有完全自主产权,没有使用第三方ofd开发包.可以根据你的需求快速定制开发.本阅读器还在开发完善阶段,如有任何问题,可以联系我QQ:13712486.博客:htt ...
随机推荐
- 【G】开源的分布式部署解决方案(三) - 一期规划定稿与初步剖析
G.系列导航 [G]开源的分布式部署解决方案 - 预告篇 [G]开源的分布式部署解决方案(一) - 开篇 [G]开源的分布式部署解决方案(二) - 好项目是从烂项目基础上重构出来的 [G]开源的分布式 ...
- webqq的注册登记和聊天页面--运用jsonp跨域
简介: 我们知道,ajax用于数据交互,但它不能跨域,跨域是指从一个域名的网页去请求另一个域名的资源.比如从http://www.baidu.com/ 页面去请求 http://www.google. ...
- spring boot项目发布tomcat容器(包含发布到tomcat6的方法)
spring boot因为内嵌tomcat容器,所以可以通过打包为jar包的方法将项目发布,但是如何将spring boot项目打包成可发布到tomcat中的war包项目呢? 1. 既然需要打包成wa ...
- 从零开始--Spring项目整合(2)整合SpringMVC
1.pom.xml 定义版本 <properties> <spring.version>4.2.7.RELEASE</spring.version> <jac ...
- 规范 : login 对象的account
accountInfo对象是前台pass 给后台,基本上这对象的资源有可能不是完整的. 举个例子:register 需要accountInfo 对象(内容数量是依据项目),但是在login时,不需要给 ...
- 规范 : jobbox 中英文
中英文是为了candidate 可以看到不同的post job 语言. e.g. 如果是contact person 的“designation” ,这个不会显示在post job 里,目的只是给em ...
- IOS 中openGL使用(使用基准图快速制作滤镜)
Color Lookup Table 在影像处理领域中,当我们想要调整一个影像的色彩时,经常会用到 Color Lookup Table 的技术. 举个简单的例子,如果我们想要让影像中的每个像素的R值 ...
- JS中的onclick事件
原文链接:https://segmentfault.com/q/1010000007955542?_ea=1503986 我自己做了一下测试. 这个是在html里面直接绑定onclick事件,我打印了 ...
- RunTime.getRuntime().exec()运行脚本命令介绍和阻塞
java在企业级项目开发中,无论是强制性的功能需要,还是为了简便java的实现,需要调用服务器命令脚本来执行.在java中,RunTime.getRuntime().exec()就实现了这个功能. ...
- Selenium 显示等待和隐式等待
1. 设置显示等待 Java代码: 1 2 3 4 5 public static WebElement WaitForElement(WebDriver driver, String locator ...