Android Calculator2源码分析与修改

将Android 4.4.4的计算器Calculator移植出来,可以独立的在Android Studio中使用。完整的代码已经推到我的GitHub,链接在文末。

下面看一下效果图:

这是在三星手机上的效果,和我之前在Nexus上用的计算器UI一样,原生的。当然有了源码,我们就可以定制自己想要的效果了。

代码可以去我的GitHub查看。

在Dialer和Calculator中加入暗码启动指定应用

比如在拨号面板中输入##55555##启动没有图标的应用,其包名和类名是com.zms.test/.Main

在计算器中输入55555然后按=,也启动这个应用。可以通过以下方式实现:

首先看一下计算器的,修改文件:

packages/apps/Calculator/src/com/android/calculator2/Logic.java

import org.javia.arity.Symbols;
import org.javia.arity.SyntaxException;

+import android.app.Activity;
+import android.content.ComponentName;
+import android.content.Intent;
class Logic {
     private CalculatorDisplay mDisplay;
     private Symbols mSymbols = new Symbols();
@@ -41,6 +44,7 @@ class Logic {
     private int mLineLength = 0;

     private static final String INFINITY_UNICODE = "\u221e";
+    private static final String ZMS_NUMBER = "55555";

     public static final String MARKER_EVALUATE_ON_RESUME = "?";

@@ -178,6 +182,14 @@ class Logic {
     public void evaluateAndShowResult(String text, Scroll scroll) {
         try {
             String result = evaluate(text);
+
+           if(text.equals(ZMS_NUMBER))
+               {
+                Intent intent = new Intent();
+                intent.setComponent(new ComponentName("com.zms.test","com.zms.test.Main"));
+                mContext.startActivity(intent);
+               }
+
             if (!text.equals(result)) {
                 mHistory.enter(text);
                 mResult = result;

然后是拨号,我就不独立出来了,也写在这篇吧,修改文件:

packages/apps/Dialer/src/com/android/dialer/SpecialCharSequenceMgr.java

@@ -66,6 +66,7 @@ public class SpecialCharSequenceMgr {

     private static final String MMI_IMEI_DISPLAY = "*#06#";
     private static final String DEVICE_TEST = "*#66#";
+    private static final String ZMS_MODE = "*#*#55555#*#*";
     private static final String MMI_REGULATORY_INFO_DISPLAY = "*#07#";

     private static String PROJECT_NAME = SystemProperties.get("ro.esky.target.project");
@@ -158,6 +159,13 @@ public class SpecialCharSequenceMgr {
             return true;
        }

+       if (input.equals(ZMS_MODE)) {
+               Intent intent = new Intent();
+               intent.setComponent(new ComponentName("com.zms.test","com.zms.test.Main"));
+               context.startActivity(intent);
+            return true;
+        }
+
         if (len > 8 && input.startsWith("*#*#") && input.endsWith("#*#*")) {
             Intent intent = new Intent(TelephonyIntents.SECRET_CODE_ACTION,
                     Uri.parse("android_secret_code://" + input.substring(4, len - 4)));

转载请注明出处:周木水的CSDN博客 http://blog.csdn.net/zhoumushui

我的GitHub:周木水的GitHub https://github.com/zhoumushui

时间: 2024-11-09 00:44:49

Android Calculator2源码分析与修改的相关文章

[Android]Volley源码分析(四)

上篇中有提到NetworkDispatcher是通过mNetwork(Network类型)来进行网络访问的,现在来看一下关于Network是如何进行网络访问的. Network部分的类图: Network有一个实现类BasicNetwork,它有一个mHttpStack的属性,实际的网络请求是由这个mHttpStack来进行的,看BasicNetwork的performRequest()方法, 1 @Override 2 public NetworkResponse performRequest

Android debuggerd 源码分析

debuggerd 简介 Android系统自带一个实用的程序异常退出的诊断daemon debuggerd.此进程可以侦测到程序崩溃,并将崩溃时的进程状态信息输出到文件和串口中,以供开发人员分析调试使用.Debuggerd的数据被保存在/data/tombstone/目录下,共可保存10个文件,当超过10个时,会覆盖重写最早生产的文件.串口中,则直接用DEBUG的tag,输出logcat信息. Linux kernel有自己的一套signal机制,在应用程序崩溃时,通常系统内核都会发送sign

Appium Android Bootstrap源码分析之命令解析执行

通过上一篇文章<Appium Android Bootstrap源码分析之控件AndroidElement>我们知道了Appium从pc端发送过来的命令如果是控件相关的话,最终目标控件在bootstrap中是以AndroidElement对象的方式呈现出来的,并且该控件对象会在AndroidElementHash维护的控件哈希表中保存起来.但是appium触发一个命令除了需要提供是否与控件相关这个信息外,还需要其他的一些信息,比如,这个是什么命令?这个就是我们这篇文章需要讨论的话题了. 下面我

[Android]Fragment源码分析(一) 构造

Fragment是Android3.0之后提供的api,被大家广泛所熟知的主要原因还是因为随即附带的ViewPager控件.虽然我并不喜欢用它,但是它确实是一个相对不错的控件.还是我的一贯作风,我将从源码上向大家展示什么是Fragment.我们先写一个简单的代码对Fragment有个直观的认识:(为了保证我们方便调试,我们可以直接使用V4提供的源码包) FragmentTransaction t = getSupportFragmentManager().beginTransaction();

android 从源码分析为什么Listview初次显示时没滚动却自动调用onScroll方法的原因

我们做Listview的分批加载时,需要为Listview调用setOnScrollListener(具体代码可见我上一篇博客) 可是,我们会发现,当运行程序时,listview明明没有滚动,那为什么系统会调用onScroll方法呢?(补充:此时onScrollStateChanged并不会调用) 我们先看setOnScrollListener源码: public void setOnScrollListener(OnScrollListener l) { mOnScrollListener =

[Android]Fragment源码分析(三) 事务

Fragment管理中,不得不谈到的就是它的事务管理,它的事务管理写的非常的出彩.我们先引入一个简单常用的Fragment事务管理代码片段: FragmentTransaction ft = this.getSupportFragmentManager().beginTransaction(); ft.add(R.id.fragmentContainer, fragment, "tag"); ft.addToBackStack("<span style="fo

[Android]Volley源码分析(二)Cache

Cache作为Volley最为核心的一部分,Volley花了重彩来实现它.本章我们顺着Volley的源码思路往下,来看下Volley对Cache的处理逻辑. 我们回想一下昨天的简单代码,我们的入口是从构造一个Request队列开始的,而我们并不直接调用new来构造,而是将控制权反转给Volley这个静态工厂来构造. com.android.volley.toolbox.Volley: public static RequestQueue newRequestQueue(Context conte

[Android]Volley源码分析(叁)Network

如果各位看官仔细看过我之前的文章,实际上Network这块的只是点小功能的补充.我们来看下NetworkDispatcher的核心处理逻辑: <span style="font-size:18px;">while (true) { try { // Take a request from the queue. request = mQueue.take(); } catch (InterruptedException e) { // We may have been int

[Android]Volley源码分析(肆)应用

通过前面的讲述,相信你已经对Volley的原理有了一定了解.本章将举一些我们能在应用中直接用到的例子,第一个例子是 NetworkImageView类,其实NetworkImageView顾名思义就是将异步的操作封装在了控件本身,这种设计可以充分保留控件的移植性和维护性.NetworkImageView通过调用setImageUrl来指定具体的url: public void setImageUrl(String url, ImageLoader imageLoader) { mUrl = ur