㈠ 怎样去优化安卓app的界面设计
第一点:了解你的目标客户群的心态 1、做微任务的目标客户群(如随时随地看看新闻,听听歌,看看电影,聊聊八卦之类): 这类的解决方案是设计的app最好是小而准,不要大而全。越全的功能应用,只能代表着这个应用在各方面的都很平庸 2、喜欢当工具来使用的目标客户群:比如找地图,看天气,查数据等。 这类的解决方案是 我们尽最大努力的去满足用户的情景需求。做到极致和简单。 3、无聊的客户群,用来打发消磨时间的:无需求,漫无目的的 这类的解决方案是尽可能展示用户感兴趣的东西,帮助客户来打发消磨时光。 第二点:APP原型图的制作和设计讨论 这个环节是必不可少的。需要根据设计需求认认真真的来画画原型图。 常用的APP原型图工具:移动APP原型设计神器 POP 、axure、Foreui等 第三点:APP视觉设计与设计要点 (1)大概设计板块有APP启动页面设计,APP界面设计的尺寸规范,app图标设计等 一般来说,手机屏幕是从上往下布局的,重要的信息会放在上方。但是在操作上,大部分人都是单手拿手机,常用的操作,要放在界面的下方。 另外还有一个原则,最小的触摸单位,一般是44个像素。如果再小,你的拇指难以触碰,或者容易引发误操作。同时,也不要让界面太拥挤。 所以,设计师必须用减法设计,这个过程需要花时间思考、简化元素。 你必须记住:(1)隐藏设计或者减法设计 (2)分区或分类 (3)帮用户做决策 (4)提高交互创新设计 (5)让人有爽快感和新奇感 (6)在设计中浸入情感,把握用户的心理。(谈谈如何进行产品设计以及产品情感化设计) 一位大师这样说过“真正的简约设计是:作品必须不断的被简化,一改再改,直到设计最终成形。” 2014年 APP设计风格趋向扁平化和卡片化。卡片,扁平化都会是移动app设计的趋势!认为卡片设计确实同时兼具了“拟物”和“极简”2种优势!
㈡ 如何设计android4.4规范的像素1080x1920的界面
1、尺寸以及分辨率:Android的界面尺寸比较流行的有:480*800、720*1280、1080*1920,我们在做设计图的时候建议是以480*800的尺寸为标准;2、界面基本组成元素:界面基本组成元素包括:状态栏+导航栏+主菜单栏+内容区域;以480*800的尺寸为标准下的各个元素的高度(其实导航栏和菜单栏每一个应用都或许不一样,android对于尺寸没有太明确的数据规范)如下:3、字体:Android系统中,DroidSans是默认字体,与微软雅黑很像;4、操作栏:1、”操作栏”对于Android应用来说是最重要的设计元素,它通常在应用运行的所有时间都呆在屏幕顶部;2、操作栏的基本布局:1向上+2Spinner视图控制+3重要操作按钮+4操作:其中,向上按钮,点击后是去到当前界面的上一个层级,非第一层级界面有此按钮,第一层级界面则无向上按钮;Spinner是用于展示内容的下拉菜单,其内容包括视图的快速切换和显示相关内容的完整信息;操作(actionoverflow)是集合操作栏中不常用的和非重要操作的地方。5、多面板布局:多面板布局的是针对平板电脑,把手机端的目录视图和详情视图两个层级的界面,甚至的页面,复合展示在同一个界面中,有效地利用平板电脑的屏幕空间,扁平化层级结构,简化导航。这点在iPad上已经运用得相当娴熟了。6、选择:Android4.0中的长按与Android2.3及更早期的版本有很大的不同。早期版本长按操作后,是出现情境菜单的浮出层。在Android4.0中,长按后在操作栏的位置会覆盖一个临时的情境操作栏,不再弹出情境菜单浮出层。在临时情境操作栏的环境下,当前界面的内容项允许被单个处理,也允许被批量处理。7、返回和向上:返回按键用在手机全局的虚拟导航栏中,基于用户最近查看的界面历史,采用时间倒序的方式,连接界面间的关系。向上按钮用在操作栏的左侧,基于层级结构,点击后是去到当前界面的上一个层级,若当前界面已经是最高一级,则没有向上按钮。8、主题样式:推出三套默认主题:Holo浅色主题、Holo深色主题、Holo浅色底+深色操作栏主题。主推app在这三套默认主题的基础上做设计,以加快app研发效率,但只是建议使用,并没有完全强制。9、触摸与反馈:用户触摸应用中的可操作区域,应当在视觉上有响应,微小的反馈会给用户带来很好地效果;10、按钮:1、按钮的3种表现形式如下图:2、对于仅包括图标的按钮,不需要使用背景色;11、滑块:滑块的几种表现形式如下图:12、进度条:如果某个操作需要花费很长的时间,就需要用进度条的指示和旋转圈的形式来表示:1、如果你可以知道当前任务完成的比例,那么使用进度条,让用户了解大约还需要多久才能完成;2、当使用旋转圆圈时,不要配以文字标签。旋转的圆圈已经表明了正在进行后台操作。13、开关:用户通过开关作出选择,包括3种形式:复选框+单选按钮+开关;1、复选框:用户可以在一个集合中作出多个选择:2、单选按钮:单选按钮允许用户在一个集合中做一次选择;3、开关:开关控制单个选项的状态;14、对话框:应用通过对话框让用户作出决定或者填写一些信息,1、对话框的左边一般情况下是取消按钮,右边是确定按钮;
㈢ 完全一样安卓4.0手机对比安卓4.0平板
【IT168 评测】在这个Android手机大行其道的时代,现在最热门的话题是什么?毫无疑问的是Android4.0。无论是普通用户还是发烧友,都对这个具有革命性升级的操作系统抱有极大的关注。之所以说Android 4.0有着革命性的升级,主要是因为4.0的界面和之前的Android界面完全不一样,据谷歌的说法是Android系统在4.0时代将会使手机和平板电脑达到一个统一,也就是说,无论是手机还是平板,都是使用的Android4.0系统,并且用起来的操作方式是一样的。
评测样机提供商家:睿风电讯 商家地址:中关村e世界1080 电话:010-57138088
▲Android4.0系统的平板电脑和手机
什么是安卓4.0?
Android 4.0系统研发代号为Ice Cream Sandwich,简称ICS,中文名称:冰淇淋三明治,是谷歌发布的最新一代手机和平板电脑的操作系统。
▲谷歌总部Android4.0冰激凌三明治的吉祥物
安卓干嘛要弄这么多版本?
安卓2.0/3.0/4.0都是怎么回事?
其实要把这事儿说明白了简单但也复杂。说简单是因为我一说大家就能明白,说复杂是因为这事儿几乎要从世界上有猫的那一年说起...
话说,谷歌的Android系统一直是按部就班的升级,1.0到1.5到2.0到2.1到2.2这样。大家一直相安无事,过着美满幸福的生活。
但是2010年的时候,苹果出了iPad这么个东西,卖的挺火,然后很多厂商也想去搞平板电脑,操作系统自然就是首选好用又开源的Android了。但是不要忘了Android系统诞生的时候就是按照一个智能手机的需求去设计的,后来大家就发现,把这么一个手机系统放在平板电脑上会有各种不爽,怎么办呢?谷歌说,大家别急,那么多平板电脑用我们的系统,我们不会不管的,后来谷歌干脆专门为Android平板电脑重新设计了一个合适的系统(内核一样但界面UI不同)。为了区别于之前手机的Android 2.x系统,就叫Android 3.0。从此,平板电脑就有了一个专用的系统:Android 3.0。从此以后,平板电脑的系统就是3.0到3.1到3.2这么按部就班的升级着。
这样看来,手机有专用的系统,平板也有专用的系统了,应该天下太平了吧?非也,开发人员后来发现想给Android系统的机器做个软件实在是太麻烦了。本来就要考虑各个品牌不同手机配置和屏幕分辨率的差异,这下好了,又来了个Android 3.0,一个程序要做成N个不同的版本(比如QQ就有至少4种版本),开发个软件还不把我累死啊?本来做Android软件赚钱就不容易(底下小声嘟囔:瞧人家IOS...一个给iPhone,一个给iPad,两个版本就全搞定)。不仅仅是开发者,硬件厂商和谷歌也看到了这点,总不能把精力都放在内耗上吧?
后来,谷歌就做出了一个“艰难”的决定,神马2.x,神马3.x,不要区分神马手机神马平板了,以后再升级新的系统,用像平板3.0那样炫酷的界面,要适应平板电脑,也要是适合于手机。这样手机和平板就都装一个就行了。软件开发者省事,用户无论是用手机还是平板,上手也不费劲。于是Android 4.0诞生了。
手机平板机型和开屏界面
谷歌说了Android 4.0系统手机和平板电脑的统一,那么以后的Android4.0手机和Android4.0平板就是完全一样的了?
为了解决大家的疑问,今天笔者就找来了两台Android4.0设备,一个手机,一个平板电脑。让两台机器的界面做一个比较,看看手机版和平板电脑版本的Android4.0有什么相同和不同的地方。
手机上我们使用了三星的GALAXY Nexus(原生Android4.0),平板电脑则是纽曼K97(使用官方刷机包升级至Android4.0)。
▲纽曼K97和三星GALAXY Nexus
首先看解锁界面,两款设备在解锁界面上几乎是一样的,都是一个圆环形的图标,向左拖动是拍照,向右拖动则是直接解锁屏幕。
▲Android 4.0 手机锁屏界面
▲Android 4.0 平板锁屏界面
▲Android4.0平板和手机的解锁屏幕操作视频
主屏和主屏按钮的布局
打开屏幕,我们看到了Android桌面的主页面。主页面看起来基本的风格都是一致的,只是平板进入程序的按键在屏幕右上角,而手机的进入程序的按键则是在屏幕底部中间,旁边还有一些程序的快捷键。谷歌搜索,数字时间,电池电量等等小细节也都是一致的,只是放在屏幕当中的位置略有差异。手机中基本都是集中在屏幕顶部,而平板则更多的放置在了屏幕底部。
在手机上比较明显的另一个改变是手机屏幕当中使用了三颗虚拟的触摸按键,也就是说以后的Android4.0手机都不需要在手机屏幕地下搞触摸键了。按键直接显示在屏幕当中,当运行一些全屏程序的时候也可以有效的避免误触。
这三个键在Android 3.0的平板电脑当中就有这样的设计,到了Android4.0,手机也和平板电脑都统一为这三科屏幕触摸键了。这三可触摸键的作用分别是:返回,主页,和程序列表(相当于过去Android手机的长按主页键切换最近运行过的程序)。
▲Android 4.0 手机主屏界面
▲Android 4.0 平板主屏界面
Android 4.0手机和平板进入程序功能表视频
切换最近程序列表的对比
说到了切换程序,我们就来看下手机和平板切换程序的界面。在最近程序列表的界面上,手机和平板是一样的。当然,手机的屏幕尺寸小一些,所以程序列表占满了整个屏幕,而平板上则是占用了不到一半的屏幕面积。
▲Android 4.0手机 最近程序列表截图
▲Android 4.0平板 最近程序列表截图
▲Android 4.0手机和平板 点击最近程序列表
程序和插件图标功能表
打开程序的功能表界面,发现手机和平板也是一样的。顶部有程序和桌面插件的分类。直接向右滑动可以切换程序页面,划过程序后则是进入到桌面插件页面。所有的桌面插件都要在此添加,Android2.x时代的直接长按桌面选择添加插件的时代已经一去不复返了。
▲Android 4.0手机的程序图标功能表
▲Android 4.0平板 程序图标功能表
▲Android 4.0手机和平板 功能表和桌面插件页面
添加桌面插件的方式
前面说过所有的桌面插件都要在此添加,在Android 4.0当中已经不能靠直接长按桌面选择添加插件了。下面就让我们通过截图看下在4.0系统中,手机和平板电脑要如何添加桌面的小插件。
▲Android 4.0手机 只能从功能表添加桌面插件
▲Android 4.0平板 同样只能从功能表添加桌面插件
▲Android 4.0手机 长按桌面只能选择壁纸 不能添加插件
▲Android 4.0平板 长按桌面 同样只能选择壁纸 不能添加插件
操作系统内的菜单分栏
前面介绍完主界面,功能表,接下来就是程序菜单界面了。
程序的菜单这里自然是设置菜单了,因为...Android就这么一个菜单,剩下的基本都是图标形式的。进入设置菜单。虽然颜色主题风格还是一样的,但是我们可以看出来在平板界面上直接分出了左右两栏,左边是目录栏,右边则可以显示出内容。充分利用了平板的大尺寸屏幕优势。
▲Android4.0平板菜单 分为目录/内容的分栏显示
而在手机上,则还是直接的一条下来,每个功能还要点进去,使用别的功能还要返回。
▲Android4.0手机菜单 没有目录/内容的分栏显示
这时手机屏幕竖直的状况,那么如果把手机横过来呢?Android4.0会不会也利用一下宽屏的优势呢?经过我们的测试,发现手机版本的Android4.0并不能达到这个效果,及时把手机横过来也不会出现平板系统的那种左右分栏效果,看来,手机的系统和平板的系统在淡淡的结构上还是有着区分的对待的。
▲Android4.0手机横屏 也不会出现目录/内容的分栏显示
▲Android4.0手机横屏 也不会出现目录/内容的分栏显示
对比总结 可升级4.0机型简介
总结
经过我们的测试,我们可以得出如下的结论:Android4.0的手机系统与平板系统,在界面的颜色主题风格和操作上几乎是完全一致的,相似度可以达到99%。区别就是Android4.0在平板上的布局位置有一些细节上的小变化。不过即使这样,也并不会有之前Androi2.0和3.0那样操作差异比较大的感觉。
当然,虽然系统软件基本是一样的,但是手机和平板的硬件还是有不小的差距的,并不是说一台Android4.0手机就可以代替Android平板。
可升级Android4.0机型
我们已经了解到了Android4.0手机系统和Android4.0平板系统的区别,那么什么样的手机能升级到Android 4.0呢?理论上只要是Android可以运行2.3系统,处理器达到1GHz的手机,都可以升级到Android4.0,但是很多没有官方承诺可以升级的机型只能期待民间高手放出ROM升级包了。
▲528Mhz处理器的G1都可以4.0,不过要靠移植的ROM了
▲玩家保有量大的机型基本都可以升级到Android 4.0,比如这个HTC Sensation(G14)
现在得知可以升级到Android 4.0的手机有下面这些型号(官方承诺可以升级):
三星:GALAXY S2以及之后推出的机型,例如GALAXY Note
索尼爱立信:LT18i,ST18i,MT11i
摩托罗拉:Atrix2(包括)以及之后推出的机型,例如Droid RAZR
HTC:Desire HD之后推出的机型,例如Sensation(G14)
华为Honer荣耀,小米手机
▲近期上市的新款手机基本上官方都会提供升级4.0
▲华为honor荣耀已经升级到了官方的Android4.0
㈣ Android设置界面怎么做
步骤/方法
1
1、下载设置必备的几款软件,分别是LauncherPro、Desktop Visualizer。
2
2、下载Android界面显示必备的Windows Phone 7的素材包。
3
3、下载透明时钟插件。
4
4、在以上必备软件素材下载完毕之后,安装LauncherPro和Desktop Visualizer以及透明时钟,把Android界面显示必备的Windows Phone 7的素材包的素材文件夹,放置到手机SD卡里。
5
5、选择LauncherPro作为当前默认界面,需在一款空白的屏幕。点击Android手机的Menu键,选择首选项(Preferences)进入LauncherPro的设置。
6
6、选择外观设置,选择快捷菜单背景,进入图库,找到以下图片,设置即可。
Windows Phone 7界面底部素材
7
7、把LauncherPro的界面设置成五行,在刚刚的设置中找到高级设置,勾选桌面5行图标。
8
8、回到桌面,把LauncherPro的底部图标统统清除,长按其中一个,然后选择更改快捷方式,选择空白,最后在中间的原点处长按选择更改快捷方式,选择程序菜单,再选择自定义图标,再到图库中选择上图的背景图片即可。在这完成之后,Android界面显示的Windows Phone 7底部就已经完成。
9
9、在桌面空白处长按,选择Desktop Visualize(中)的Widget,进入Widget设置界面。在选择图标中,选择影像档,在图库中选择添加前面下载的小图片素材,在选择操作中添加你要打开的程序。
添加Desktop Visualiz的Widget
长按新添加的Widget,拖动小箭头调整大小。调整完毕后,按返回键。 希望可以帮到你
㈤ 写android程序时怎么创建一个没有界面的程序啊,我想写一个服务程序。
一、
package com.example.zhuanhuan;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import com.example.zhuanhuan.MainActivity;
import com.example.zhuanhuan.R;
import com.example.zhuanhuan.KkkActivity;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button zhuceButton = (Button) findViewById(R.id.button2);
Button dengluButton = (Button) findViewById(R.id.button1);
final EditText yonghumingEditText = (EditText) findViewById(R.id.editText1);
final EditText mimaEditText = (EditText) findViewById(R.id.editText2);
zhuceButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setClass(MainActivity.this, KkkActivity.class);
startActivity(intent);
}
};
dengluButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
try {
FileInputStream fis = new FileInputStream(Environment.getExternalStorageDirectory().getPath()+"/"+ yonghumingEditText.getText().toString());
byte[] input = new byte[fis.available()];
while(fis.read(input) != -1 );
fis.close();
//Toast.makeText(getApplicationContext(), new String(input), Toast.LENGTH_SHORT).show();
String mimaString = new String(input);
if (mimaString.equals(mimaEditText.getText().toString())==true) {
Toast.makeText(getApplicationContext(), "成功登陆", Toast.LENGTH_SHORT).show();
Intent intent = new Intent();
intent.setClass(MainActivity.this, QqqActivity.class);
startActivity(intent);
}
else {
Toast.makeText(getApplicationContext(), "用户名或密码错误", Toast.LENGTH_SHORT).show();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
二、
package com.example.zhuanhuan;
import java.security.PublicKey;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class QqqActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.qqq);
Button fanhuiButton = (Button) findViewById(R.id.button2);
Button jianceButton = (Button) findViewById(R.id.button1);
jianceButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "注册成功", Toast.LENGTH_SHORT).show();
Intent new = new Intent();
intent.setClass(QqqActivity.this, MainActivity.class);
startActivity(intent);
}
});
fanhuiButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setClass(QqqActivity.this, AaaActivity.class);
startActivity(intent);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.qqq, menu);
return true;
}
}
三、
package com.example.zhuanhuan;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import com.example.zhuanhuan.MainActivity;
import com.example.zhuanhuan.R;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class KkkActivity extends Activity {
private File writeFile;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.kkk);
Button backButton = (Button) findViewById(R.id.button1);
final EditText yonghumingEditText = (EditText) findViewById(R.id.editText1);
final EditText mimaEditText = (EditText) findViewById(R.id.editText2);
backButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
File writeFile = new File(Environment.getExternalStorageDirectory().getPath(), yonghumingEditText.getText().toString());
if (!writeFile.exists()) {
try {
writeFile.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
String abcString = mimaEditText.getText().toString();
FileOutputStream fos;
try {
for = new FileOutputStream(writeFile);
fos.write(abcString.getBytes());
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Intent intent = new Intent();
intent.setClass(KkkActivity.this, MainActivity.class);
startActivity(intent);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.kkk, menu);
return true;
}
}
四、
package com.example.zhuanhuan;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class AaaActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.aaa);
Button jianceButton = (Button) findViewById(R.id.button1);
jianceButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setClass(AaaActivity.this, QqqActivity.class);
startActivity(intent);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.aaa, menu);
return true;
}
}
㈥ android界面跳转怎么实现
没明白你的跳转是要干嘛!但是下面给你说下!Intent是跳转页面用的
你可以在Button 监听事件里面写Intent in=new Intent(A.this,B.class);startActivity(in);<A指的的当前Activity 的名字,B 是指要跳转的Activity 的名字,记住要在AndrioidManifest.xml声明这些Activity,不然会报错的>
㈦ Android4.0系统怎么进入设置界面
Android
4.0.4系统进入设置的方法非常简单,我们只需在待机桌面点击应用按钮,在应用列表页找到设置图标,轻轻点击即可进入系统设置界面。
㈧ 如何定制 android 主界面
果你要定制一个Android系统,你想用你自己的Launcher(Home)作主界面来替换Android自己的Home,而且不希望用户安装的Launcher来替换掉你的Launcher.
我们可以通过修改Framework来实现这样的功能。
这里以Android2.1的源代码为例来实际说明。
1)首先了解一下Android的启动过程。
Android系统的启动先从Zygote开始启动,然后......(中间的过程就不说了).....一直到了SystemServer(framework)这个地方,看到这段代码:
/**
* This method is called from Zygote to initialize the system. This will cause the native
* services (SurfaceFlinger, AudioFlinger, etc..) to be started. After that it will call back
* up into init2() to start the Android services.
*/
native public static void init1(String[] args);
public static void main(String[] args) {
if (SamplingProfilerIntegration.isEnabled()) {
SamplingProfilerIntegration.start();
timer = new Timer();
timer.schele(new TimerTask() {
@Override
public void run() {
SamplingProfilerIntegration.writeSnapshot("system_server");
}
}, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL);
}
// The system server has to run all of the time, so it needs to be
// as efficient as possible with its memory usage.
VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);
System.loadLibrary("android_servers");
init1(args);
}
public static final void init2() {
Log.i(TAG, "Entered the Android system server!");
Thread thr = new ServerThread();
thr.setName("android.server.ServerThread");
thr.start();
}
}
从SystemServer的main函数开始启动各种服务。
首先启动init1,然后启动init2.
从上面的注释可以看到:init1这个方法时被Zygote调用来初始化系统的,init1会启动native的服务如SurfaceFlinger,AudioFlinger等等,这些工作做完以后会回调init2来启动Android的service。
这里我们主要来关注init2的过程。
init2中启动ServerThread线程,
ServerThread中启动了一系列的服务,比如这些:
ActivityManagerService
EntropyService
PowerManagerService
TelephonyRegistry
PackageManagerService
AccountManagerService
BatteryService
HardwareService
Watchdog
SensorService
BluetoothService
StatusBarService
ClipboardService
InputMethodManagerService
NetStatService
ConnectivityService
AccessibilityManagerService
NotificationManagerService
MountService
DeviceStorageMonitorService
LocationManagerService
SearchManagerService
FallbackCheckinService
WallpaperManagerService
AudioService
BackupManagerService
AppWidgetService
这些大大小小的服务起来以后,开始
((ActivityManagerService)ActivityManagerNative.getDefault()).systemReady()
在systemReady后开始开始启动Launcher。
在寻找Launcher的时候是根据HOME的filter(在Manifest中定义的<category android:name="android.intent.category.HOME" />)来过滤。
然后根据filter出来的HOME来启动,如果只有一个HOME,则启动这个HOME,如果用户自己装了HOME,那就会弹出来一个列表供用户选择。
我们现在希望从这里弹出我们自己定制的Launcher,同时也不希望弹出选择HOME的界面,我们不希望用户修改我们的home,比如我们的home上放了好多广告,以及强制安装的程序,不希望用户把它干掉。
我们可以通过这样来实现:
2) 定义一个私有的filter选项,然后用这个选项来过滤HOME.
一般情况下我们使用Manifest中定义的<category android:name="android.intent.category.HOME"来过滤的,我们现在增加一个私有的HOME_FIRST过滤。
在Intent.java(frameworks/base/core/java/android/content/Intent.java)中添加两行代码
//lixinso:添加CATEGORY_HOME_FIRST
@SdkConstant(SdkConstantType.INTENT_CATEGORY)
public static final String CATEGORY_HOME_FIRST = "android.intent.category.HOME_FIRST";
3)修改和CATEGORY_HOME相关的所有的地方,都改成HOME_FIRST,主要是framework中的这几个地方:
frameworks/base/services/java/com/android/server/am/ActivityManagerService.java中
//intent.addCategory(Intent.CATEGORY_HOME);
改成intent.addCategory(Intent.CATEGORY_HOME_FIRST); //lixinso:
//if (r.intent.hasCategory(Intent.CATEGORY_HOME)) {
改成if (r.intent.hasCategory(Intent.CATEGORY_HOME_FIRST)) { //lixinso: Intent.CATEGORY_HOME -> Intent.CATEGORY_HOME_FIRST
frameworks/base/services/java/com/android/server/am/HistoryRecorder.java中
// _intent.hasCategory(Intent.CATEGORY_HOME) &&
改成 _intent.hasCategory(Intent.CATEGORY_HOME_FIRST) && //lixinso: Intent.CATEGORY_HOME->Intent.CATEGORY_HOME_FIRST
frameworks/policies/base/mid/com/android/internal/policy/impl/MidWindowManager.java中
//mHomeIntent.addCategory(Intent.CATEGORY_HOME);
改成 mHomeIntent.addCategory(Intent.CATEGORY_HOME_FIRST); //lixinso
frameworks/policies/base/mid/com/android/internal/policy/impl/RecentApplicationsDialog.java中
//new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME),0);
改成 new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME_FIRST),0); //lixinso
frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java中
//mHomeIntent.addCategory(Intent.CATEGORY_HOME);
改成 mHomeIntent.addCategory(Intent.CATEGORY_HOME_FIRST); //lixinso
frameworks/policies/base/phone/com/android/internal/policy/impl/RecentApplicationsDialog.java中
//ResolveInfo homeInfo = pm.resolveActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME),0);
改成 ResolveInfo homeInfo = pm.resolveActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME_FIRST),0); //lixinso
4) 写一个自己的Launcher.
可以参考android sample中的Launcher,或者android源代码中的 /packages/apps/Launcher 来写。
在Launcher中标记其是不是Launcher的最关键的代码时Manifest中的filter:android:name="android.intent.category.HOME"
现在我们定义了自己的filter,那么,我们在我们自己写的Launcher中将Manifest改为:
<application android:process="android.process.acore3" android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".FirstAppActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME_FIRST" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.MONKEY" />
</intent-filter>
</activity>
</application>
然后将编译好的apk放到/out/target/proct/generic/system/app目录下。
5)将Android自带的Launcher删除掉,包括源代码(packages/apps/Launcher)和apk(/out/target/proct/generic/system/app/Launcher.apk)。
6)
做完这些工作,就可以重新编译Android了,我们可以编译修改过的几个相关的包。
如果之前编译过了Android源码,可以用mmm命令来编译部分的改动。
这里需要这样编译:
$ . build/envsetup.sh
$ mmm frameworks/base
$ mmm frameworks/base/services/java
$ mmm frameworks/policies/base/mid
$ mmm frameworks/policies/base/phone
7)
编译完成后重新生成img文件。
$ make snod
8) 现在可以启动Android模拟器来看效果了。
首先设置环境变量:
$ export ANDROID_PRODUCT_OUT= ./out/target/proct/generic
然后切换到
$ cd ./out/host/linux-x86/bin
运行
$ ./emulator
这样我们启动的模拟器里面用的image就是我们刚才编译好的自己定制的东西了。
从模拟器上可以看到启动的Launcher是我们自己的Launcher,不会出现默认的Launcher了,也不会出现选择界面。
9)我们再验证一下,如果用户装上了一个其他的Launcher(Home)会怎么样。
从网上找一个一般的Launcher或者自己写一个一般的Launcher装上去,重新启动,不会出现选择界面。
按HOME键也不会出来两个HOME来选择。
㈨ 华为手机出现android怎么办
如果手机进入Fastboot模式,长按电源键10s左右强制重启手机即可退出。