IOC注入技术之源码时注入技术,Android Studio插件开发

常见Android Studio插件

1.GsonFormat
快速将json字符串转换成一个Java Bean,免去我们根据json字符串手写对应Java Bean的过程。
使用方法:快捷键Alt+S也可以使用Alt+Insert选择GsonFormat
2.AndroidButterKnife Zelezny
配合ButterKnife实现注解,从此不用写findViewById,想着就爽啊。在Activity,Fragment,Adapter中选中布局xml的资源id自动生成butterknife注解。
使用方法:Ctrl+Shift+B选择图上所示选项
3.AndroidCode Generator
根据布局文件快速生成对应的Activity,Fragment,Adapter,Menu。
4.AndroidParcelable code generator
JavaBean序列化,快速实现Parcelable接口。
5.AndroidMethods Count
显示依赖库中得方法数
6.LifecycleSorter
可以根据Activity或者fragment的生命周期对其生命周期方法位置进行先后排序,快捷键Ctrl + alt + K
7.CodeGlance
在右边可以预览代码,实现快速定位
8.findBugs-IDEA
查找bug的插件,Android Studio也提供了代码审查的功能(Analyze-Inspect Code…)
9.ADBWIFI
使用wifi无线调试你的app,无需root权限
Android wifi无线调试App新玩法ADB WIFI
10.AndroidPixelDimenGenerator
Android Studio自动生成dimen.xml文件插件
11.JsonOnlineViewer
在Android Studio中请求、调试接口
12.AndroidStyler
根据xml自动生成style代码的插件

制作Android Studio插件

插件1:生成全新的java文件
插件2:在已经存在的文件中加入代码

参考文档:https://www.w3cschool.cn/intellij_idea_doc/intellij_idea_doc-785d2ea9.html

插件1:根据输入的字符串生成全新的java文件

字符串的协议格式:

Name(字段名称)Type(数据类型)Desc(字段描述)
nameString姓名
ageint年龄

根据输入的name和Age生成一个包含name和Age字段的JavaBean。

制作步骤

1. 新建Plugin项目

New Project -> IntelliJ Platform Plugin,Project SDK 选择IntelliJ IDEA内置的:

在这里插入图片描述
因为是开发IntelliJ IDEA的插件,肯定要用IntelliJ IDEA的SDK。

2.编写plugin.xml

默认plugin.xml已经生成,需要在里面的<actions>标签下添加action

<idea-plugin>
  <id>GenerateJavabeanByString_20200223</id>
  <name>GenerateJavabeanByString_20200223</name>
  <version>1.0</version>
  <vendor email="support@yourcompany.com" url="http://www.yourcompany.com">YourCompany</vendor>

  <description><![CDATA[
      Enter short description for your plugin here.<br>
      <em>most HTML tags may be used</em>
    ]]></description>

  <change-notes><![CDATA[
      Add change notes here.<br>
      <em>most HTML tags may be used</em>
    ]]>
  </change-notes>

  <!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description -->
  <idea-version since-build="173.0"/>

  <!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
       on how to target different products -->
  <!-- uncomment to enable plugin in all products
  <depends>com.intellij.modules.lang</depends>
  -->

  <extensions defaultExtensionNs="com.intellij">
    <!-- Add your extensions here -->
  </extensions>

  <actions>
    <!-- Add your actions here -->
    <action id="GenerateJavabeanByString_id" class="action.GenerateJavabeanByString" text="action.GenerateJavabeanByString"
            description="action的描述">
      <add-to-group group-id="NewGroup" anchor="first"/>
      <keyboard-shortcut keymap="$default" first-keystroke="shift ctrl alt A"/>
    </action>
  </actions>

</idea-plugin>

这个xml文件里面最重要的是actions标签,actions标签里面就是一个个action,action是什么?你点击IntelliJ IDEA里面任何菜单按钮出现的一个个选项都是一个个action,比如Code -> Override Methods 就是一个action。

如何在actions标签下面新建一个action,可以直接手写,当然也可以右键点击项目的src文件夹 -> New -> Plugin DevKit -> Action以可视化的方式生成action,如下图:
在这里插入图片描述
点击OK按钮后会在plugin.xml中生成action相关的代码,同时在src/action目录下生成了GenerateJavabeanByString类。完成后续步骤的代码,生成插件jar包,然后安装完这个插件后,当点击这个action时就会执行GenerateJavabeanByString里面的public void actionPerformed(AnActionEvent e)方法。

3.在actionPerformed()方法里面编写代码逻辑。

public class GenerateJavabeanByString extends AnAction {

    private String member = "public";

    private String pasteStr = "name String\n" +
            "age int\n" + "id Integer\n";

    /**
     * 当我们选择action的时候,就执行这里面的代码
     */
    @Override
    public void actionPerformed(AnActionEvent e) {
        // TODO: insert action logic here
        generateFile(e, "User", pasteStr);

    }

    private void generateFile(AnActionEvent actionEvent, String fileName, String pasteStr) {
        //得到当前工程对象
        Project project = actionEvent.getProject();
        //得到目录服务
        JavaDirectoryService directoryService = JavaDirectoryService.getInstance();
        //得到当前路径(相对路径,一是点击右键的位置)
        IdeView ideView = actionEvent.getRequiredData(LangDataKeys.IDE_VIEW);
        PsiDirectory directory = ideView.getOrChooseDirectory();

        //填入模版文件的参数
        Map<String, String> map = new HashMap();
        map.put("NAME", fileName);
        map.put("INTERFACES", "implements Serializable");
        map.put("PACKAGE_NAME", CommonUtil.getPackageName(project));

        //模版做好了,就可以生成文件
        PsiClass psiClass = directoryService.createClass(directory, fileName, "GenerateFileByString", false, map);

        //开始加入字段
        WriteCommandAction.runWriteCommandAction(project,
                new Runnable() {
                    @Override
                    public void run() {
                        generateModelField(pasteStr, project, psiClass);
                    }
                });

    }

    private void generateModelField(String pasteStr, Project project, PsiClass psiClass) {
        if (psiClass == null) {
            return;
        }
        PsiElementFactory factory = JavaPsiFacade.getInstance(project).getElementFactory();
        //根据用户输入的字符串生产出代码来
        //"name String\n"+"age int\n";
        String[] lineString = pasteStr.split("\n");
        StringBuilder sb = new StringBuilder();
        for (String line : lineString) {
            String[] temp = line.split(" ");
            String fieldName = temp[0];
            String fieldType = temp[1];
            //public String name;
            sb.append(member + " " + fieldType + " " + fieldName + ";");
            PsiField field = factory.createFieldFromText(sb.toString(), psiClass);
            psiClass.add(field);
            sb.delete(0, sb.length());
        }

    }
}


4.生成jar包

点击Build -> Prepare Plugin Module ‘GenerateJavabeanByString’ for Deployment 即可在项目中生成GenerateJavabeanByString.jar这个jar包。
生成的jar包就是插件,可以发布到插件市场供别人下载使用。

5.使用插件

安装插件后,选择项目的src文件夹,右键 -> New -> GenerateJavabeanByString, 输入字符串,即可在该目录下生成一个java类。

插件2:在已经存在的java类文件中加入代码

这个插件可以实现用鼠标选择布局文件的名称后自动生成Butterknife的注入相关的代码。

类似的插件已经很多了,比如:Android ButterKnife Zelezny,在Android Studio的Plugins中搜索安装即可使用,但是本文主要是用Butterknife插件来讲解源码时注入技术的原理。

整体思路:
在这里插入图片描述

根据用户选择的xml文件名称,提取出xml文件中有id属性的View节点,得到所有View元素,然后根据这些View元素生成UI相关的代码。

代码逻辑编写完成后,参考上述生成jar包的步骤生成jar包,然后安装插件,即可使用。

使用效果:

MainActivity的代码如下:

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
	}

}

鼠标选择布局文件名称activity_main,然后点击Code->ButterknifePluginDemo,在弹出的对话框中选择要生成代码的View,点击确定即自动生成相关的代码,自动帮我们完成了控件注入和事件注入。

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";
 
    @BindView(R.id.frameLayout)
    public FrameLayout mFrameLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
	}
	
	@OnClick(R.id.frameLayout)
    public void frameLayoutClick(FrameLayout frameLayout) {
    }

}

我们只要在frameLayoutClick()方法中写点击事件相关的逻辑代码就可以了。

上面的类似这种:

    @BindView(R.id.frameLayout)
    public FrameLayout mFrameLayout;

	@OnClick(R.id.frameLayout)
    public void frameLayoutClick(FrameLayout frameLayout) {
    }

的代码就不需要我们手写了,当大型项目中的布局文件复杂时,这种代码还是很多的,虽然简单,但是手写也需要花费很长的时间,我们尽量不要写这种重复又没有任何逻辑的模板代码。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值