当前位置:  编程技术>移动开发
本页文章导读:
    ▪Context的子类兑现:ContextImpl的初始化        Context的子类实现:ContextImpl的初始化 一、Context: Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows acce.........
    ▪ 小米科技首座架构师汪文俊确定演讲主题:Android程序的编译,安装和运行 | Android DevCamp | CMDN移动开发者俱乐部清凉夏日嘉年华        小米科技首席架构师汪文俊确定演讲主题:Android程序的编译,安装和运行 | Android DevCamp | CMDN移动开发者俱乐部清凉夏日嘉年华小米科技首席架构师汪文俊确认演讲主题:《Android程序的编译.........
    ▪ 在源码中监听activity起动       在源码中监听activity启动上周做一个小的功能,修改statusbar,在launcher界面和其它应用界面显示不同的背景色和icon,最初想的就是接受系统activity启动的广播,进行判断,研究了一段时间,发.........

[1]Context的子类兑现:ContextImpl的初始化
    来源: 互联网  发布时间: 2014-02-18
Context的子类实现:ContextImpl的初始化

一、Context:

Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc

1、它描述的是一个应用程序环境的信息,即上下文。

2、该类是一个抽象(abstract class)类,Android提供了该抽象类的具体实现类(后面我们会讲到是ContextIml类)。

3、通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作,例如:启动一个Activity,发送广播,接受Intent

信息 等。。

对于我们用到的Activity、Service、Application等都是Context,Context是一个抽象类,它的真正实现是ContextImpl.java中,而Activity、Service、Application用到的Context都是ContextImpl的实例。

二、Context实例创建:

1、创建Activity时:

在启动Activity时:

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {

Activity activity = null;

if (activity != null) {

      ContextImpl appContext = new ContextImpl();

      appContext.init(r.packageInfo, r.token, this);

      appContext.setOuterContext(activity);

        activity.attach(appContext, this, getInstrumentation(), r.token,

             r.ident, app, r.intent, r.activityInfo, title, r.parent,

             r.embeddedID, r.lastNonConfigurationInstances, config);

}

        }

2.Service:

在ActivityThread.java中,当创建handleCreateService进行初始化:

Service service = null;

try {

ContextImpl context = new ContextImpl();

context.init(packageInfo, null, this);

Application app = packageInfo.makeApplication(false, mInstrumentation);

context.setOuterContext(service);

service.attach(context, this, data.info.name, data.token, app,

ActivityManagerNative.getDefault());

service.onCreate();

}

3.Application

private final void handleBindApplication(AppBindData data){
     ...
    ///创建Application对象
     Application app = data.info.makeApplication(data.restrictedBackupMode, null);
     ...
}

public Application makeApplication(boolean forceDefaultAppClass,

  Instrumentation instrumentation) {
    ...
    try {
        java.lang.ClassLoader cl = getClassLoader();
         ContextImpl appContext = new ContextImpl();    //创建一个ContextImpl对象实例
         appContext.init(this, null, mActivityThread);  //初始化该ContextIml实例的相关属性
         ///新建一个Application对象 
         app = mActivityThread.mInstrumentation.newApplication(
                cl, appClass, appContext);
        appContext.setOuterContext(app);  //将该Application实例传递给该ContextImpl实例         
    }


    
[2] 小米科技首座架构师汪文俊确定演讲主题:Android程序的编译,安装和运行 | Android DevCamp | CMDN移动开发者俱乐部清凉夏日嘉年华
    来源: 互联网  发布时间: 2014-02-18
小米科技首席架构师汪文俊确定演讲主题:Android程序的编译,安装和运行 | Android DevCamp | CMDN移动开发者俱乐部清凉夏日嘉年华

小米科技首席架构师汪文俊确认演讲主题:《Android程序的编译,安装和运行》。

讲师简介:汪文俊,中国科技大学硕士,原IBM系统工程师,现为小米科技MIUI首席架构师,开源C编译器项目ucc的作者。

话题简介:Android程序的编译,安装和运行。从程序员的观点探索Android系统提供的编程抽象,从程序的整个生命周期讨论一下Android系统结构。


小米科技有可能还将分享主题:《MIUI锁屏机制的实现》。之前在CMDN Club上,小米科技的工程师董红光曾经分享主题:《Android系统如何实现换肤及MIUI主题风格的实现》获得与会者的一致好评。

MIUI是小米公司基于Android深度定制的系统,其中一个重要的改进和亮点,就是系统全局支持主题换肤的功能,本次演讲将围绕该功能展开,深入分析和探讨MIUI主题功能的设计理念,整体结构与实现技术细节,给开发者一个简单参考,希望可以起到抛砖引玉的作用。

新闻报道:http://mobile.csdn.net/a/20120301/312643_2.html


关于:CMDN移动开发者俱乐部清凉夏日嘉年华

iOS DevCamp 7月27日 | Android DevCamp 7月28日 | 北京 | 新云南皇冠假日酒店

这是一个真正属于移动开发者的会议,参会者以交流、学习、提高、答疑解惑的移动开发实践者为主,你将极少看到投资人、市场人员、名人大腕、还有不知是何目的来参会的“打酱油”的人。参会者只有像你一样的有经验的开发者和工程师。 


【特色】:

- 一个真正意义上的iOS/Android开发技术大会。

- 企业间、团队间交流和学习移动开发技术实践的平台。

- Dev to Dev,来自开发者,服务开发者。所有课程内容均不含任何商业推广目的。

- 课程内容覆盖iOS/Android知识体系的重要方面,并重点分享典型移动产品的开发实践。

- 国内资深移动开发专家评审团队对所有课程进行把关,确保课程内容全部为“无水分” “干货” 。

- 全部课程均有资深开发者讲授,他们或许不是名人大腕,但一定是“技术大牛”

- 与会者全部都是移动开发者和工程师及其开发团队成员


【特别设计】:

- 每一个课程打上该属性|Overview、中级|Intermediate、高级|Advanced的标签,有较多代码内容的课程,则打上“Code”标签,以帮助参会者选择参加。

- 每天下午课程结束后,还有2小时的开放空间讨论,由专业引导式引导讨论 

- 课程结束后,所有参会者都可以在线做一个测试,以检验一天课程的学习成果,并帮助自己整理一天的知识重点。 所有测试题,均由格外讲师根据自己的演讲内容和幻灯片来提出。 



    
[3] 在源码中监听activity起动
    来源: 互联网  发布时间: 2014-02-18
在源码中监听activity启动

上周做一个小的功能,修改statusbar,在launcher界面和其它应用界面显示不同的背景色和icon,最初想的就是接受系统activity启动的广播,进行判断,研究了一段时间,发现接受不到广播,最后在网上搜索资料,发现monkey代码中有一段代码可以接受activity启动和resume事件。最终满足要求。代码如下

  1.设置观察者

  mAm = ActivityManagerNative.getDefault();          
        try {
            mAm.setActivityController(new ActivityController());
       
       } catch (RemoteException e) {
            System.err.println("** Failed talking with activity manager!");
        }

2.观察者类

private class ActivityController extends IActivityController.Stub {

//start
        public boolean activityStarting(Intent intent, String pkg) {
            currentPkg = pkg;
        mHandler.sendEmptyMessage(MSG_UPDATE_BACKGROUND);
            //currentIntent = intent;
            return true;
        }

//resume

        public boolean activityResuming(String pkg) {
        
           currentPkg = pkg;
           mHandler.sendEmptyMessage(MSG_UPDATE_BACKGROUND);
        
            return true;
        }
  public int appEarlyNotResponding(String processName, int pid, String annotation){
 return 0;
  }

        public boolean appCrashed(String processName, int pid,
                String shortMsg, String longMsg,
                long timeMillis, String stackTrace) {
           /* System.err.println("// CRASH: " + processName + " (pid " + pid + ")");
            System.err.println("// Short Msg: " + shortMsg);
            System.err.println("// Long Msg: " + longMsg);
            System.err.println("// Build Label: " + Build.FINGERPRINT);
            System.err.println("// Build Changelist: " + Build.VERSION.INCREMENTAL);
            System.err.println("// Build Time: " + Build.TIME);
            System.err.println("// " + stackTrace.replace("\n", "\n// "));

            if (!mIgnoreCrashes) {
                synchronized (Monkey.this) {
                    mAbort = true;
                }

                return !mKillProcessAfterError;
            }*/
            return false;
        }

        public int appNotResponding(String processName, int pid, String processStats) {
           // System.err.println("// NOT RESPONDING: " + processName + " (pid " + pid + ")");
            //System.err.println(processStats);
         return 0;
         }

在一个service中加入以上代码,当activity活动时就会调用上述的方法packagename为activity的所在包名

由于ActivityManagerNative和IActivityController都属于内部类,所以该方法需要在源码环境下才可以使用

附一份IActivityController.aidl源码函数说明

package android.app;

import android.content.Intent;

/**
 * Testing interface to monitor what is happening in the activity manager
 * while tests are running.  Not for normal application development.
 * {@hide}
 */
interface IActivityController
{
    /**
     * The system is trying to start an activity.  Return true to allow
     * it to be started as normal, or false to cancel/reject this activity.
     */
    boolean activityStarting(in Intent intent, String pkg);
   
    /**
     * The system is trying to return to an activity.  Return true to allow
     * it to be resumed as normal, or false to cancel/reject this activity.
     */
    boolean activityResuming(String pkg);
   
    /**
     * An application process has crashed (in Java).  Return true for the
     * normal error recovery (app crash dialog) to occur, false to kill
     * it immediately.
     */
    boolean appCrashed(String processName, int pid,
            String shortMsg, String longMsg,
            long timeMillis, String stackTrace);
   
    /**
     * Early call as soon as an ANR is detected.
     */
    int appEarlyNotResponding(String processName, int pid, String annotation);

    /**
     * An application process is not responding.  Return 0 to show the "app
     * not responding" dialog, 1 to continue waiting, or -1 to kill it
     * immediately.
     */
    int appNotResponding(String processName, int pid, String processStats);
}

 

 

 

 

 

 


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
网站运营/SEO iis7站长之家
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3