一、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实例
}
小米科技首席架构师汪文俊确认演讲主题:《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小时的开放空间讨论,由专业引导式引导讨论
- 课程结束后,所有参会者都可以在线做一个测试,以检验一天课程的学习成果,并帮助自己整理一天的知识重点。 所有测试题,均由格外讲师根据自己的演讲内容和幻灯片来提出。
上周做一个小的功能,修改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);
}