成为大神之路---学会编写Android Studio插件 别停留在用的程度了

转载 2016年06月07日 00:49:07

一、概述

相信大家在使用Android Studio的时候,或多或少的会使用一些插件,适当的配合插件可以帮助我们提升一定的开发效率,更加快乐。例如:

有句话叫做授人以鱼不如授人以渔,不能一直跟随着别人的脚步去使用插件了,有必要去学习编写插件,当自己有好的创意的时候,就可以自己实现了。So,本文的内容是:

  • 自己编写一个Android Studio插件

ok,其实编写插件并不难,官方也有详细的文档,所以你也可以选择直接阅读下文学习:

为了文章有一定的流畅性,决定以ECTranslation作为编写Android Studio插件的例子。

我为什么选这个呢?因为创意好,实用并且代码简单。

贴一个今天这个插件的最终效果图:

注:效果与ECTranslation基本一致,本文仅用作学习,不造轮子,如果需要使用,直接使用ECTranslation即可。

二、准备工作

首先需要安装IntelliJ IDEA

下载好就可以了~~

然后安装,运行,点击create New Project:


按照上图进行选择,如果没有SDK,则点击New新建一个即可。

然后点击Next,输入项目名称选择位置,就可以点击finish了。

项目的结构如下:


src目录下主要用于存放我们编写的代码。

这样准备工作就结束了~~

三、编码

(1) 关键知识

编码实际上核心的一个类叫做AnAction,可以直接选择NEW->Action,如下图:


然后填写一些相关信息:


需要填写的属性如下:

  • ActionID:代表该Action的唯一的ID,一般的格式为:pluginName.ID
  • ClassName:类名
  • Name:就是最终插件在菜单上的名称
  • Description:对这个Action的描述信息

然后往下,选择这个Action即将存在的位置:

我们选择的是EditMenu,右侧选择为first,即EditMenu下的第一个,效果如图:


再往下就是制定快捷键了~~

都填写完成就可以点击OK了。

点击ok之后,可以看到为我们生成了下类:

<code class="language-java hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">TranslateAction</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">extends</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">AnAction</span> {</span>
    <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">actionPerformed</span>(AnActionEvent e) {
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// TODO: insert action logic here</span>
    }
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>

此外我们刚才填写的信息,也在plugin.xml中完成了注册,大家可以进去看一眼,actions的标签中,

当我们点击菜单的时候,就回触发actionPerformed()方法。

那么这么看,我们在这个方法中只要完成三件事:

  1. 获得当前选中的单词
  2. 调用相关API得到单词的意思
  3. 通过一个类似于PopupWindow来显示

当然,为了尽快的测试,你可以先在里面弹一个对话框,例如如下:

<code class="language-java hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">actionPerformed</span>(AnActionEvent event) {
        Messages.showMessageDialog(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Hello World !"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Information"</span>, Messages.getInformationIcon());
    }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

预期效果是点击Tranlate菜单,或者按快捷键会弹出一个提示对话框。

那么点击Run:


然后它会默认启动一个新的IntelliJ IDEA的界面,你可以随便新建一个项目,进入以后,你会发现Edit下多了一个Translate菜单,点击即可弹出我们设定的对话框:


ok,测试通过就放心了~

  1. 获得当前选中的单词
  2. 调用相关API得到单词的意思
  3. 通过一个类似于PopupWindow来显示

剩下的就是功能性的API了~

(2) 获得当前选中的单词

<code class="language-java hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">actionPerformed</span>(AnActionEvent e) {
    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// TODO: insert action logic here</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">final</span> Editor mEditor = e.getData(PlatformDataKeys.EDITOR);
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span> == mEditor) {
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span>;
    }
    SelectionModel model = mEditor.getSelectionModel();
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">final</span> String selectedText = model.getSelectedText();
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (TextUtils.isEmpty(selectedText)) {
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span>;
    }
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li></ul>

是不是觉得API很陌生,恩,我也觉得很陌生,关于API这里介绍其实没什么意义,本文主要目的是让大家对自定义插件有个类helloworld的认识,至于插件里面的代码涉及到的API等到大家需要编写插件的时候,再详细学习就好了,现在就不要浪费精力记忆这些东西了。

上面的代码就是获得选中的文本,通过一个Editor,然后拿到SelectionModel,再拿到selectedText,从字面上还是蛮好理解的。

拿到选中的文本之后,应该就是去查询该单词的意思了,查询呢,ECTranslation用的是youdao的Open SDK,其实也很简单,就是拼接一个url,然后等着解析返回数据就好了。

(3)调用相关API得到单词的意思

有道API的地址:

大家如果想要做单词翻译,可以看下,非常简单。

涉及到的代码:

<code class="language-java hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">String baseUrl = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"http://fanyi.youdao.com/openapi.do?keyfrom=Skykai521&key=977124034&type=data&doctype=json&version=1.1&q="</span>;

HttpUtils.doGetAsyn(baseUrl + selectedText, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> HttpUtils.CallBack() {
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">onRequestComplete</span>(String result) {
        Translation translation = gson.fromJson(result, Translation.class);
        showPopupBalloon(mEditor, translation.toString());
    }
});</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>

HttpUtils就不贴了,就是直接开了个线程,通过HttpUrlConnection去访问网络,大家的项目中或者通过搜索引擎,代码一搜一堆。

baseUrl就是有道的url,加上我们选中的单词就是完整的url了,然后通过http访问,callback回调出返回的字符串,这里返回的是json类型的字符串。

baseUri是:

我们根据返回的json字符串生成了一个类Translation;

然后通过Gson转化为Translation对象。

ps:拿着上面的baseUrl后面跟一个任何单词,直接访问浏览器就能看到返回的json数据了,这里大家天天写接口,类似的步骤比我肯定还熟悉。

好了,有了返回的数据以后,直接通过一个类似popupWindow展现即可。

(4)通过一个类似于PopupWindow来显示

涉及到的代码:

<code class="language-java hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">showPopupBalloon</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">final</span> Editor editor, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">final</span> String result) {
    ApplicationManager.getApplication().invokeLater(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Runnable() {
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">run</span>() {
            JBPopupFactory factory = JBPopupFactory.getInstance();
            factory.createHtmlTextBalloonBuilder(result, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> JBColor(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Color(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">186</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">238</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">186</span>), <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Color(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">73</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">117</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">73</span>)), <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>)
                    .setFadeoutTime(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5000</span>)
                    .createBalloon()
                    .show(factory.guessBestPopupLocation(editor), Balloon.Position.below);
        }
    });
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li></ul>

这个API,恩,我copy的源码,依然是不求记住,知道这有个类似的功能即可。

简单看一下,是通过创建一个JBPopupFactory,然后通过它创建一个HtmlTextBalloonBuilder,通过这个builder去设置各种参数,最后show。

ok,对于一个入门的例子,不要太强求对插件中这些API的掌握,还是那句话,等需要写了再去查,需要什么功能,哪怕到对应的插件中去copy源码都可以,当然也有文档:

有兴趣的可以整理各种类型的插件,比如弹出popupWindow,生成代码,生成文件类别的,然后对相关的API进行收集与整理。

这样代码写完了,先测试一下,点击RUN,然后看效果~

我们这里肯定是测试没问题的,效果图就是开始的那个gif.

如果没有问题,就可以去部署和发布我们的插件给别人去使用了。

这两部也非常简单。

四、部署插件

(1)填写插件相关信息

打开项目文件的plugin.xml,如下图:


在里面填写id,name,version等。。。记得随便填一下~

然后,点击build->prepare plugin…,如下图:


会在项目的根目录生成一个jar,如图:


这个jar就可以用于安装了。

(2)安装插件

打开Andorid Studio,选择Preferences -> Plugins -> Install plugin from disk,选择我们生成的jar即可,如图:


点击安装,然后重启即可。

好了,重启完成就可以在EDIT下看到Translate菜单了,选中单词,点击菜单或者快捷键都能实现翻译了。

如果你有兴趣,赶紧编写一个插件自己玩吧。

当然,还可以把我们的插件发布到仓库,支持在plugin中搜索安装,参考:

就是注册账号,提交jar,填写信息,等着审核就可以了。

五、总结

终于到了总结的环节,这么长的文章其实编写插件总结起来就几句话。

  1. 下载Intellij IDEA,新建一个Intellij IDEA plugin的项目
  2. 然后在里面new Action以及编写API
  3. 点击prepare plugin生成jar,这个jar就可以用来安装了。

恩,就是这么简单,实践起来会比较麻烦一点,等成功以后,回过头来总结,发现步骤其实就那么几个步骤~~对于实际的Action相关的API,等你在编写相关插件的时候,参考别的类似插件,查看官方文档都可以。

转自:http://blog.csdn.net/lmj623565791/article/details/51548272

学会编写Android Studio插件 别停留在用的程度了

转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/51548272; 本文出自:【张鸿洋的博客】 从使用插件到编写插件,...
  • lmj623565791
  • lmj623565791
  • 2016年06月01日 09:00
  • 41506

自己编写Android Studio插件 别停留在用的程度了

相信大家在使用Android Studio的时候,或多或少的会使用一些插件,适当的配合插件可以帮助我们提升一定的开发效率,更加快乐。例如:https://github.com/zzz40500/Gso...
  • ls5835766
  • ls5835766
  • 2017年10月15日 16:18
  • 90

android开发之路-----------转自任玉刚大神

前言 看到一篇文章中提到“最近几年国内的初级Android程序员已经很多了,但是中高级的Android技术人才仍然稀缺“,这的确不假,从我在百度所进行的一些面试来看,找一个适合的高级Androi...
  • u013457570
  • u013457570
  • 2015年12月25日 17:48
  • 1463

【mysql 修炼之路】如何从菜鸟成为mysql 大神?

首先MySQL大多是跑在Linux环境上的,所以我们需要学习一下Linux的知识,最基础的需要了解: ■ Linux的安装及目录结构意义 ■ 常用的Linu...
  • u013421629
  • u013421629
  • 2017年06月02日 15:35
  • 1359

程序员进阶之路:如何从零开始成为技术大神

知乎上有人问,成为顶尖的程序员是否需要学会武术,获赞最多的评论是一定要会武术,而有必要在公司年会上表演出来。 什么单手开砖,空手道,双截棍等均可,因为这样的话产品在提需求的时候一定会非常小心谨慎,也保...
  • u011606348
  • u011606348
  • 2015年07月17日 11:49
  • 2784

安卓学习,从初学者到大神

工欲善其事,必先利其器 虽然Android开发的门槛比较低,但是有件得心应手的兵器还是很有必要的。 开发设备 : Mac (作为开发者,我认为入手一台mac还是很有必要的,推荐还是...
  • u013034736
  • u013034736
  • 2015年05月19日 13:23
  • 870

如何提问才能进阶成为前端大神?(转自张鑫旭的博客)

基本上每天微博、博客以及邮件都会受到很多同行的问题咨询,我个人是非常欢迎交流与学习的,因此有问必答。但是,毕竟一个人精力有限,我又没有财力请经纪人或者小秘之类的,如何高效利用时间就是对于我来讲就是非常...
  • u014326381
  • u014326381
  • 2015年09月05日 13:20
  • 2203

想要成为Linux大神,你应该和我一样这样做!

大神终究是孤独的,在Linux这条路上,有太多的人,而我们走着走着就分离了,我们在各自的道路上按照我们自己的方法去寻找着属于我们的道路,属于我们的那一片领土! 第一天 我们从3开始 3、ec...
  • simengphp
  • simengphp
  • 2017年11月13日 09:21
  • 167

Java大神修炼之路

        一、基础篇   1.1 JVM   1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收   http...
  • huaieli1
  • huaieli1
  • 2016年01月17日 00:27
  • 883

怎么成为java大神?

说掌握了一下十项全能就可以成为java大神,各位java大神来说说真实体验!! 1、语法:必须比较熟悉,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样的语法错误并且知道...
  • yuolligeng
  • yuolligeng
  • 2015年05月08日 20:02
  • 766
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:成为大神之路---学会编写Android Studio插件 别停留在用的程度了
举报原因:
原因补充:

(最多只允许输入30个字)