首页 文章 精选 留言 我的

精选列表

搜索[android studio],共10000篇文章
优秀的个人博客,低调大师

Android 自定义注解之运行时注解(RetentionPolicy.RUNTIME)

RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在 获取注解的常用方法: /** * 获取指定类型的注解 */ public <A extends Annotation> A getAnnotation(Class<A> annotationType); /** * 获取所有注解,如果有的话 */ public Annotation[] getAnnotations(); /** * 获取所有注解,忽略继承的注解 */ public Annotation[] getDeclaredAnnotations(); /** * 指定注解是否存在该元素上,如果有则返回true,否则false */ public boolean isAnnotationPresent(Class<? extends Annotation> annotationType); /** * 获取Method中参数的所有注解 */ public Annotation[][] getParameterAnnotations(); 1. 定义注解 /** * @author mazaiting * @date 2018/1/16 */ public class RuntimeAnnotation { /** * 适用类、接口(包括注解类型)或枚举 */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface ClassInfo { String value(); } /** * 适用变量,也包括枚举常量 */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface FieldInfo { int[] value(); } /** * 适用方法 */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MethodInfo { String name() default "long"; String data(); int age() default 24; } } 2. 使用注解 /** * @author mazaiting * @date 2018/1/16 */ @RuntimeAnnotation.ClassInfo("TestRuntimeAnnotation class") public class TestRuntimeAnnotation { @RuntimeAnnotation.FieldInfo(value = {1, 2}) public String fieldnfo = "FieldInfo"; @RuntimeAnnotation.FieldInfo(value = {10086}) public int i = 100; @RuntimeAnnotation.MethodInfo(name = "mazaiting", data = "big") public static String getMethodInfo() { return TestRuntimeAnnotation.class.getSimpleName(); } } 3. 解析注解 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView textView = (TextView) findViewById(R.id.textView); /**运行时注解*/ textView.setText(parse()); } /** * 解析运行时注解 */ private String parse() { // 创建一个线程安全的字符串拼接对象 StringBuffer sb = new StringBuffer(); // 获取类字节码 Class cls = TestRuntimeAnnotation.class; // 获取构造方法 Constructor[] constructors = cls.getConstructors(); // 获取指定类型的注解 // 获取ClassInfo注解 sb.append("Class注解:").append("\n"); RuntimeAnnotation.ClassInfo classInfo = (RuntimeAnnotation.ClassInfo) cls.getAnnotation(RuntimeAnnotation.ClassInfo.class); if (null != classInfo) { // 拼接访问修饰符和类名 sb.append(Modifier.toString(cls.getModifiers())).append(" ") .append(cls.getSimpleName()).append("\n"); sb.append("注解值:").append(classInfo.value()).append("\n\n"); } // 获取FieldInfo注解 Field[] fields = cls.getDeclaredFields(); for (Field field : fields) { RuntimeAnnotation.FieldInfo fieldInfo = field.getAnnotation(RuntimeAnnotation.FieldInfo.class); if (null != fieldInfo) { // 拼接访问修饰符,类型名,字段名 sb.append(Modifier.toString(field.getModifiers())).append(" ") .append(field.getType().getSimpleName()).append(" ") .append(field.getName()).append("\n"); sb.append("注解值:").append(Arrays.toString(fieldInfo.value())).append("\n\n"); } } // 获取MethodInfo注解 sb.append("Method注解:").append("\n"); Method[] methods = cls.getDeclaredMethods(); for (Method method: methods) { RuntimeAnnotation.MethodInfo methodInfo = method.getAnnotation(RuntimeAnnotation.MethodInfo.class); if (null != methodInfo) { // 拼接访问修饰符、返回值类型、方法名 sb.append(Modifier.toString(method.getModifiers())).append(" ") .append(method.getReturnType().getSimpleName()).append(" ") .append(method.getName()).append("\n"); // 注解值 sb.append("注解值:").append("\n"); sb.append("name: ").append(methodInfo.name()).append("\n"); sb.append("data: ").append(methodInfo.data()).append("\n"); sb.append("age: ").append(methodInfo.age()).append("\n"); } } return sb.toString(); } } 效果图: 效果图.png

优秀的个人博客,低调大师

Android--小技巧:如何实现“再按一次退出程序”效果

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/79022166 实现原理:需要在退出的页面activity里复写onKeyDown()方法实现功能逻辑,从而实现该功能。 //声明一个long类型变量:用于存放上一点击“返回键”的时刻 private long mExitTime; @Override public boolean onKeyDown(int keyCode, KeyEvent event) { //判断用户是否点击了“返回键” if (keyCode == KeyEvent.KEYCODE_BACK) { //与上次点击返回键时刻作差 if ((System.currentTimeMillis() - mExitTime) > 2000) { //大于2000ms则认为是误操作,使用Toast进行提示 Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show(); //并记录下本次点击“返回键”的时刻,以便下次进行判断 mExitTime = System.currentTimeMillis(); } else { //小于2000ms则认为是用户确实希望退出程序-调用System.exit()方法进行退出 finish(); System.exit(0); } return true; } return super.onKeyDown(keyCode, event); } //点击返回按钮在后台运行 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { moveTaskToBack(false); return true; } return super.onKeyDown(keyCode, event); }

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册