当前位置:文档之家› 应用程序包的安装是android的特点

应用程序包的安装是android的特点

应用程序包的安装是android的特点
应用程序包的安装是android的特点

应用程序包的安装是android的特点

APK为AndroidPackage的缩写

Android应用安装有如下四种方式:

1.系统应用安装――开机时完成,没有安装界面

2.网络下载应用安装――通过market应用完成,没有安装界面

3.ADB工具安装――没有安装界面。

4.第三方应用安装――通过SD卡里的APK文件安装,有安装界面,由packageinstaller.apk应用处理安装及卸载过程的界面。

应用安装的流程及路径

应用安装涉及到如下几个目录:

system/app ---------------系统自带的应用程序,获得adb root权限才能删除

data/app ---------------用户程序安装的目录。安装时把 apk文件复制到此目录data/data ---------------存放应用程序的数据

data/dalvik-cache--------将apk中的dex文件安装到dalvik-cache目录下(dex文件是dalvik虚拟机的可执行文件,其大小约为原始apk文件大小的四分之一)

安装过程:

复制APK安装包到data/app目录下,解压并扫描安装包,把dex文件(Dalvik字节码)保存到dalvik-cache目录,并data/data目录下创建对应的应用数据目录。

卸载过程:

删除安装过程中在上述三个目录下创建的文件及目录。

安装应用的过程解析

一.开机安装

PackageManagerService处理各种应用的安装,卸载,管理等工作,开机时由systemServer启动此服务

(源文件路径:android\frameworks\base\services\java\com\android\server\PackageManagerService.java)

PackageManagerService服务启动的流程:

1.首先扫描安装“system\framework”目录下的jar包

[java]view plaincopyprint?

1.// Find base frameworks (resource packages without code).

2. mFrameworkInstallObserver = new AppDirObserver(

3. mFrameworkDir.getPath(), OBSERVER_EVENTS, true);

4. mFrameworkInstallObserver.startWatching();

5. scanDirLI(mFrameworkDir, PackageParser.PARSE_IS_SYSTEM

6. | PackageParser.PARSE_IS_SYSTEM_DIR,

7. scanMode | SCAN_NO_DEX, 0);

2.扫描安装系统system/app的应用程序

[java]view plaincopyprint?

1.// Collect all system packages.

2. mSystemAppDir = new File(Environment.getRootDirectory(), "app");

3. mSystemInstallObserver = new AppDirObserver(

4. mSystemAppDir.getPath(), OBSERVER_EVENTS, true);

5. mSystemInstallObserver.startWatching();

6. scanDirLI(mSystemAppDir, PackageParser.PARSE_IS_SYSTEM

7. | PackageParser.PARSE_IS_SYSTEM_DIR, scanMode, 0);

3.制造商的目录下/vendor/app应用包

[java]view plaincopyprint?

1.// Collect all vendor packages.

2. mVendorAppDir = new File("/vendor/app");

3. mVendorInstallObserver = new AppDirObserver(

4. mVendorAppDir.getPath(), OBSERVER_EVENTS, true);

5. mVendorInstallObserver.startWatching();

6. scanDirLI(mVendorAppDir, PackageParser.PARSE_IS_SYSTEM

7. | PackageParser.PARSE_IS_SYSTEM_DIR, scanMode, 0);

4.扫描“data\app”目录,即用户安装的第三方应用

[java]view plaincopyprint?

1.scanDirLI(mAppInstallDir, 0, scanMode, 0);

5.扫描" data\app-private"目录,即安装DRM保护的APK文件(一个受保护的歌曲或受保护的视频是使用 DRM 保护的文件)[java]view plaincopyprint?

1.scanDirLI(mDrmAppPrivateInstallDir, PackageParser.PARSE_FORWARD_LOCK,

2. scanMode, 0);

扫描方法的代码清单

[java]view plaincopyprint?

1.private void scanDirLI(File dir, int flags, int scanMode, long currentTime) {

2. String[] files = dir.list();

3. if (files == null) {

4. Log.d(TAG, "No files in app dir " + dir);

5. return;

6. }

7. if (false) {

8. Log.d(TAG, "Scanning app dir " + dir);

9. }

10. int i;

11. for (i=0; i

12. File file = new File(dir, files[i]);

13. if (!isPackageFilename(files[i])) {

14. // Ignore entries which are not apk's

15. continue;

16. }

17. PackageParser.Package pkg = scanPackageLI(file,

18. flags|PackageParser.PARSE_MUST_BE_APK, scanMode, currentTime);

19. // Don't mess around with apps in system partition.

20. if (pkg == null && (flags & PackageParser.PARSE_IS_SYSTEM) == 0 &&

21. mLastScanError == PackageManager.INSTALL_FAILED_INVALID_APK) {

22. // Delete the apk

23. Slog.w(TAG, "Cleaning up failed install of " + file);

24. file.delete();

25. }

26. }

27. }

并且从该扫描方法中可以看出调用了scanPackageLI()

private PackageParser.Package scanPackageLI(File scanFile,

int parseFlags, int scanMode, long currentTime)

跟踪scanPackageLI()方法后发现,程序经过很多次的if else 的筛选,最后判定可以安装后调用了 mInstaller.install

[java]view plaincopyprint?

1.if (mInstaller != null) {

2. int ret = mInstaller.install(pkgName, useEncryptedFSDir, pkg.applicationInfo.uid,pkg.applicationInfo.uid

);

3. if(ret < 0) {

4. // Error from installer

5. mLastScanError = PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE;

6. return null;

7. }

8. }

mInstaller.install()通过

LocalSocketAddress address = new LocalSocketAddress(

"installd", https://www.doczj.com/doc/f412200453.html,space.RESERVED);

指挥installd在C语言的文件中完成工作

PackageManagerService小节:1)从apk, xml中载入pacakge信息, 存储到内部成员变量中, 用于后面的查找. 关键的方法是scanPackageLI().

2)各种查询操作, 包括query Intent操作.

3)install package和delete package的操作. 还有后面的关键方法是installPackageLI().

二、从网络上下载应用:

下载完成后,会自动调用Packagemanager的安装方法installPackage()

/* Called when a downloaded package installation has been confirmed by the user */

由英文注释可见PackageManagerService类的installPackage()函数为安装程序入口。

[java]view plaincopyprint?

1.public void installPackage(

2. final Uri packageURI, final IPackageInstallObserver observer, final int flags,

3. final String installerPackageName) {

4. mContext.enforceCallingOrSelfPermission(

5. android.Manifest.permission.INSTALL_PACKAGES, null);

6. Message msg = mHandler.obtainMessage(INIT_COPY);

7. msg.obj = new InstallParams(packageURI, observer, flags,

8. installerPackageName);

9. mHandler.sendMessage(msg);

10. }

其中是通过PackageHandler的实例mhandler.sendMessage(msg)把信息发给继承Handler的类HandleMessage()方法

[java]view plaincopyprint?

1.class PackageHandler extends Handler{

2.

3.*****************省略若干********************

4. public void handleMessage(Message msg) {

5. try {

6. doHandleMessage(msg);

7. } finally {

8. Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);

9. }

10. }

11. ******************省略若干**********************

12. }

把信息发给doHandleMessage()方法,方法中用switch()语句进行判定传来Message

[java]view plaincopyprint?

1. void doHandleMessage(Message msg) {

2. switch (msg.what) {

3.

4. case INIT_COPY: {

5. if (DEBUG_SD_INSTALL) Log.i(TAG, "init_copy");

6. HandlerParams params = (HandlerParams) msg.obj;

7. int idx = mPendingInstalls.size();

8. if (DEBUG_SD_INSTALL) Log.i(TAG, "idx=" + idx);

9. // If a bind was already initiated we dont really

10. // need to do anything. The pending install

11. // will be processed later on.

12. if (!mBound) {

13. // If this is the only one pending we might

14. // have to bind to the service again.

15. if (!connectToService()) {

16. Slog.e(TAG, "Failed to bind to media container service");

17. params.serviceError();

18. return;

19. } else {

20. // Once we bind to the service, the first

21. // pending request will be processed.

22. mPendingInstalls.add(idx, params);

23. }

24. } else {

25. mPendingInstalls.add(idx, params);

26. // Already bound to the service. Just make

27. // sure we trigger off processing the first request.

28. if (idx == 0) {

29. mHandler.sendEmptyMessage(MCS_BOUND);

30. }

31. }

32. break;

33. }

34. case MCS_BOUND: {

35. if (DEBUG_SD_INSTALL) Log.i(TAG, "mcs_bound");

36. if (msg.obj != null) {

37. mContainerService = (IMediaContainerService) msg.obj;

38. }

39. if (mContainerService == null) {

40. // Something seriously wrong. Bail out

41. Slog.e(TAG, "Cannot bind to media container service");

42. for (HandlerParams params : mPendingInstalls) {

43. mPendingInstalls.remove(0);

44. // Indicate service bind error

45. params.serviceError();

46. }

47. mPendingInstalls.clear();

48. } else if (mPendingInstalls.size() > 0) {

49. HandlerParams params = mPendingInstalls.get(0);

50. if (params != null) {

51. params.startCopy();

52. }

53. } else {

54. // Should never happen ideally.

55. Slog.w(TAG, "Empty queue");

56. }

57. break;

58. }

59. ****************省略若干**********************

60.}

61.}

public final boolean sendMessage (Message msg)

public final boolean sendEmptyMessage (int what)

两者参数有别。

然后调用抽象类HandlerParams中的一个startCopy()方法

abstract class HandlerParams {

final void startCopy() {

***************若干if语句判定否这打回handler消息*******

handleReturnCode();

}

}

handleReturnCode()复写了两次其中有一次是删除时要调用的,只列出安装调用的一个方法[java]view plaincopyprint?

1.@Override

2. void handleReturnCode() {

3. // If mArgs is null, then MCS couldn't be reached. When it

4. // reconnects, it will try again to install. At that point, this

5. // will succeed.

6. if (mArgs != null) {

7. processPendingInstall(mArgs, mRet);

8. }

9. }

这时可以清楚的看见 processPendingInstall()被调用。

其中run()方法如下

[java]view plaincopyprint?

1.run(){

2.synchronized (mInstallLock) {

3. ************省略*****************

4. installPackageLI(args, true, res);

5.

6. }

7.}

8.instaPacakgeLI()args,res参数分析

//InstallArgs 是在PackageService定义的static abstract class InstallArgs 静态抽象类。[java]view plaincopyprint?

1.static abstract class InstallArgs {

2.*********************************************************************

3.其中定义了flag标志,packageURL,创建文件,拷贝apk,修改包名称,

4.还有一些删除文件的清理,释放存储函数。

5. *********************************************************************

6.}

7. class PackageInstalledInfo {

8. String name;

9. int uid;

10. PackageParser.Package pkg;

11. int returnCode;

12. PackageRemovedInfo removedInfo;

13. }

[java]view plaincopyprint?

1.private void installPackageLI(InstallArgs args,

2. boolean newInstall, PackageInstalledInfo res) {

3. int pFlags = args.flags;

4. String installerPackageName = args.installerPackageName;

5. File tmpPackageFile = new File(args.getCodePath());

6. boolean forwardLocked = ((pFlags & PackageManager.INSTALL_FORWARD_LOCK) != 0);

7. boolean onSd = ((pFlags & PackageManager.INSTALL_EXTERNAL) != 0);

8. boolean replace = false;

9. int scanMode = (onSd ? 0 : SCAN_MONITOR) | SCAN_FORCE_DEX | SCAN_UPDATE_SIGNATURE

10. | (newInstall ? SCAN_NEW_INSTALL : 0);

11. // Result object to be returned

12. res.returnCode = PackageManager.INSTALL_SUCCEEDED;

13. // Retrieve PackageSettings and parse package

14. int parseFlags = PackageParser.PARSE_CHATTY |

15. (forwardLocked ? PackageParser.PARSE_FORWARD_LOCK : 0) |

16. (onSd ? PackageParser.PARSE_ON_SDCARD : 0);

17. parseFlags |= mDefParseFlags;

18. PackageParser pp = new PackageParser(tmpPackageFile.getPath());

19. pp.setSeparateProcesses(mSeparateProcesses);

20. final PackageParser.Package pkg = pp.parsePackage(tmpPackageFile,

21. null, mMetrics, parseFlags);

22. if (pkg == null) {

23. res.returnCode = pp.getParseError();

24. return;

25. }

26. String pkgName = https://www.doczj.com/doc/f412200453.html, = pkg.packageName;

27. if ((pkg.applicationInfo.flags&ApplicationInfo.FLAG_TEST_ONLY) != 0) {

28. if ((pFlags&PackageManager.INSTALL_ALLOW_TEST) == 0) {

29. res.returnCode = PackageManager.INSTALL_FAILED_TEST_ONLY;

30. return;

31. }

32. }

33. if (GET_CERTIFICATES && !pp.collectCertificates(pkg, parseFlags)) {

34. res.returnCode = pp.getParseError();

35. return;

36. }

37. // Get rid of all references to package scan path via parser.

38. pp = null;

39. String oldCodePath = null;

40. boolean systemApp = false;

41. synchronized (mPackages) {

42. // Check if installing already existing package

43. if ((pFlags&PackageManager.INSTALL_REPLACE_EXISTING) != 0) {

44. String oldName = mSettings.mRenamedPackages.get(pkgName);

45. if (pkg.mOriginalPackages != null

46. && pkg.mOriginalPackages.contains(oldName)

47. && mPackages.containsKey(oldName)) {

48. // This package is derived from an original package,

49. // and this device has been updating from that original

50. // name. We must continue using the original name, so

51. // rename the new package here.

52. pkg.setPackageName(oldName);

53. pkgName = pkg.packageName;

54. replace = true;

55. } else if (mPackages.containsKey(pkgName)) {

56. // This package, under its official name, already exists

57. // on the device; we should replace it.

58. replace = true;

59. }

60. }

61. PackageSetting ps = mSettings.mPackages.get(pkgName);

62. if (ps != null) {

63. oldCodePath = mSettings.mPackages.get(pkgName).codePathString;

64. if (ps.pkg != null && ps.pkg.applicationInfo != null) {

65. systemApp = (ps.pkg.applicationInfo.flags &

66. ApplicationInfo.FLAG_SYSTEM) != 0;

67. }

68. }

69. }

70. if (systemApp && onSd) {

71. // Disable updates to system apps on sdcard

72. Slog.w(TAG, "Cannot install updates to system apps on sdcard");

73. res.returnCode = PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION;

74. return;

75. }

76. if (!args.doRename(res.returnCode, pkgName, oldCodePath)) {

77. res.returnCode = PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE;

78. return;

79. }

80. // Set application objects path explicitly after the rename

81. setApplicationInfoPaths(pkg, args.getCodePath(), args.getResourcePath());

82. pkg.applicationInfo.nativeLibraryDir = args.getNativeLibraryPath();

83. if (replace) {

84. replacePackageLI(pkg, parseFlags, scanMode,

85. installerPackageName, res);

86. } else {

87. installNewPackageLI(pkg, parseFlags, scanMode,

88. installerPackageName,res);

89. }

90. }

最后判断如果以前不存在那么调用installNewPackageLI()

[java]view plaincopyprint?

1.private void installNewPackageLI(PackageParser.Package pkg,

2. int parseFlags,int scanMode,

3. String installerPackageName, PackageInstalledInfo res) {

4. ***********************省略若干*************************************************

5. PackageParser.Package newPackage = scanPackageLI(pkg, parseFlags, scanMode,

6. System.currentTimeMillis());

7. ***********************省略若干**************************************************

8.}

最后终于回到了和开机安装一样的地方.与开机方式安装调用统一方法。

三、从ADB工具安装

其入口函数源文件为pm.java

(源文件路径:android\frameworks\base\cmds\pm\src\com\android\commands\pm\pm.java)

其中\system\framework\pm.jar 包管理库

包管理脚本 \system\bin\pm 解析

showUsage就是使用方法

[java]view plaincopyprint?

1.private static void showUsage() {

2. System.err.println("usage: pm [list|path|install|uninstall]");

3. System.err.println(" pm list packages [-f]");

4. System.err.println(" pm list permission-groups");

5. System.err.println(" pm list permissions [-g] [-f] [-d] [-u] [GROUP]");

6. System.err.println(" pm list instrumentation [-f] [TARGET-PACKAGE]");

7. System.err.println(" pm list features");

8. System.err.println(" pm path PACKAGE");

9. System.err.println(" pm install [-l] [-r] [-t] [-i INSTALLER_PACKAGE_NAME] [-s] [-f] PATH");

10. System.err.println(" pm uninstall [-k] PACKAGE");

11. System.err.println(" pm enable PACKAGE_OR_COMPONENT");

12. System.err.println(" pm disable PACKAGE_OR_COMPONENT");

13. System.err.println(" pm setInstallLocation [0/auto] [1/internal] [2/external]");

14. **********************省略**************************

15. }

安装时候会调用 runInstall()方法

[java]view plaincopyprint?

1.private void runInstall() {

2. int installFlags = 0;

3. String installerPackageName = null;

4. String opt;

5. while ((opt=nextOption()) != null) {

6. if (opt.equals("-l")) {

7. installFlags |= PackageManager.INSTALL_FORWARD_LOCK;

8. } else if (opt.equals("-r")) {

9. installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;

10. } else if (opt.equals("-i")) {

11. installerPackageName = nextOptionData();

12. if (installerPackageName == null) {

13. System.err.println("Error: no value specified for -i");

14. showUsage();

15. return;

16. }

17. } else if (opt.equals("-t")) {

18. installFlags |= PackageManager.INSTALL_ALLOW_TEST;

19. } else if (opt.equals("-s")) {

20. // Override if -s option is specified.

21. installFlags |= PackageManager.INSTALL_EXTERNAL;

22. } else if (opt.equals("-f")) {

23. // Override if -s option is specified.

24. installFlags |= PackageManager.INSTALL_INTERNAL;

25. } else {

26. System.err.println("Error: Unknown option: " + opt);

27. showUsage();

28. return;

29. }

30. }

31. String apkFilePath = nextArg();

32. System.err.println("\tpkg: " + apkFilePath);

33. if (apkFilePath == null) {

34. System.err.println("Error: no package specified");

35. showUsage();

36. return;

37. }

38. PackageInstallObserver obs = new PackageInstallObserver();

39. try {

40. mPm.installPackage(Uri.fromFile(new File(apkFilePath)), obs, installFlags,

41. installerPackageName);

42. synchronized (obs) {

43. while (!obs.finished) {

44. try {

45. obs.wait();

46. } catch (InterruptedException e) {

47. }

48. }

49. if (obs.result == PackageManager.INSTALL_SUCCEEDED) {

50. System.out.println("Success");

51. } else {

52. System.err.println("Failure ["

53. + installFailureToString(obs.result)

54. + "]");

55. }

56. }

57. } catch (RemoteException e) {

58. System.err.println(e.toString());

59. System.err.println(PM_NOT_RUNNING_ERR);

60. }

61. }

其中的

PackageInstallObserver obs = new PackageInstallObserver();

mPm.installPackage(Uri.fromFile(new File(apkFilePath)), obs, installFlags,

installerPackageName);

如果安装成功

obs.result == PackageManager.INSTALL_SUCCEEDED)

又因为有

IPackageManage mPm;

mPm = IpackageManager.Stub.asInterface(ServiceManager.getService("package"));

Stub是接口IPackageManage的静态抽象类,asInterface是返回IPackageManager代理的静态方法。

因为class PackageManagerService extends IPackageManager.Stub

所以mPm.installPackage 调用

/* Called when a downloaded package installation has been confirmed by the user */

public void installPackage(

final Uri packageURI, final IPackageInstallObserver observer, final int flags,final String installerPackageName)

这样就是从网络下载安装的入口了。

四,从SD卡安装

系统调用PackageInstallerActivity.java

(/home/zhongda/androidSRC/vortex-8inch-for-hoperun/packages/apps/PackageInstaller/src/com/android/packageinstaller)进入这个Activity会判断信息是否有错,然后调用

private void initiateInstall()判断是否曾经有过同名包的安装,或者包已经安装

通过后执行private void startInstallConfirm() 点击OK按钮后经过一系列的安装信息的判断Intent跳转到

[java]view plaincopyprint?

1.public class InstallAppProgress extends Activity implements View.OnClickListener, OnCancelListener

2. public void onCreate(Bundle icicle) {

3. super.onCreate(icicle);

4. Intent intent = getIntent();

5. mAppInfo = intent.getParcelableExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO);

6. mPackageURI = intent.getData();

7. initView();

8. }

方法中调用了initView()方法

[java]view plaincopyprint?

1.public void initView() {

2. requestWindowFeature(Window.FEATURE_NO_TITLE);

3. setContentView(https://www.doczj.com/doc/f412200453.html,yout.op_progress);

4. int installFlags = 0;

5. PackageManager pm = getPackageManager();

6. try {

7. PackageInfo pi = pm.getPackageInfo(mAppInfo.packageName,

8. PackageManager.GET_UNINSTALLED_PACKAGES);

9. if(pi != null) {

10. installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;

11. }

12. } catch (NameNotFoundException e) {

13. }

14. if((installFlags & PackageManager.INSTALL_REPLACE_EXISTING )!= 0) {

15. Log.w(TAG, "Replacing package:" + mAppInfo.packageName);

16. }

17. PackageUtil.AppSnippet as = PackageUtil.getAppSnippet(this, mAppInfo,

18. mPackageURI);

19. mLabel = https://www.doczj.com/doc/f412200453.html,bel;

20. PackageUtil.initSnippetForNewApp(this, as, R.id.app_snippet);

21. mStatusTextView = (TextView)findViewById(R.id.center_text);

22. mStatusTextView.setText(R.string.installing);

23. mProgressBar = (ProgressBar) findViewById(R.id.progress_bar);

24. mProgressBar.setIndeterminate(true);

25. // Hide button till progress is being displayed

26. mOkPanel = (View)findViewById(R.id.buttons_panel);

27. mDoneButton = (Button)findViewById(R.id.done_button);

28. mLaunchButton = (Button)findViewById(https://www.doczj.com/doc/f412200453.html,unch_button);

29. mOkPanel.setVisibility(View.INVISIBLE);

30. String installerPackageName = getIntent().getStringExtra(

31. Intent.EXTRA_INSTALLER_PACKAGE_NAME);

32. PackageInstallObserver observer = new PackageInstallObserver();

33. pm.installPackage(mPackageURI, observer, installFlags, installerPackageName);

34. }

方法最后我们可以看到再次调用安装接口完成安装。

Android布局属性大全

Android布局属性大全 布局: AbsoluteLayout(绝对布局): xmlns:android="https://www.doczj.com/doc/f412200453.html,/apk/res/android" style="@..." android:clipChildren="true|false" android:clipToPadding="true|false" android:layoutAnimation="@---" android:animationCache="true|false" android:persistentDrawingCache="none|animation|scrolling|all":持续高速缓存绘图 android:alwaysDrawnWithCache="true|false" android:andStatesFromChildre="true|false" android:descendantFocusability="beforeDescendants|afterDescendants|bl ocksDescendants":后裔可聚焦 android:id="@+id/absoluteLayout" android:tag="@---" android:android:scrollX="---" android:android:scrollY="---" android:background="@---" android:padding="----" android:paddingLeft="----" android:paddingTop="----" android:paddingRight="----" android:paddingBotton="---" android:focusable="true|false" android:focusableInTouchMode="true|false" android:visibility="visible|invisible|gone" android:fitsSystemWindows="true|false":适合系统窗口 android:scrollbars="none|horizontal|vertical" android:scrollbarStyle="insideOverlay(内覆盖)|insideInset(内插 图)|outsideOverlay(外覆盖)|outsideInset(外插图)" android:isScrollContainer="true|false":是一个滚动集合 android:fadeScrollbars="true|false":褪色的滚动条 android:scrollbarFadeDuration="---":卷轴淡出 android:scrollDefaultDelayBeforeFade="---":滚动前默认延迟 android:scrollbarSize="---" android:scrollbarThumbHorizontal="@----":拇指水平滚动条 android:scrollbarThumbVertical="@----":拇指垂直滚动条 android:scrollbarTrackVertical="@---":垂直滚动条轨道 android:scrollbarTrackHorizontal="@---":水平滚动条轨道 android:scrollbarAlwaysDrawHorizontalTrack="true|false":水平滚动条总是吸引轨道

Android应用程序开发(第二版)课后习题答案最新版

第一章 Android简介 1.简述各种手机操作系统的特点. 答案: 目前,手机上的操作系统主要包括以下几种,分别是Android、iOS、Windows Mobile、Windows Phone 7、Symbian、黑莓、PalmOS 和Linux。 (1)Android是谷歌发布的基于Linux的开源手机平台,该平台由操作系统、中间件、用户界面和应用软件组成,是第一个可以完全定制、免费、开放的手机平台。Android底层使用开源的Linux操作系统,同时开放了应用程序开发工具,使所有程序开发人员都在统一、开放的开发平台上进行开发,保证了Android应用程序的可移植性。 (2)iOS是由苹果公司为iPhone、iPod touch、iPad以及Apple TV开发的操作系统,以开放源代码的操作系统Darwin为基础,提供了SDK,iOS操作系统具有多点触摸操作的特点,支持的控制方法包括滑动、轻按、挤压和旋转, 允许系统界面根据屏幕的方向而改变方向,自带大量的应用程序。 (3)Windows Mobile是微软推出的移动设备操作系统,对硬件配置要求较高,一般需要使用高主频的嵌入式处理器,从而产生了耗电量大、电池续航时间短和硬件成本高等缺点,Windows Mobile系列操作系统包括Smartphone、Pocket PC和Portable Media Center。

随着Windows Phone 7的出现,Windows Mobile正逐渐走出历史舞台。 (4)Windows Phone 7具有独特的“方格子”用户界面,非常简洁,黑色背景下的亮蓝色方形图标,显得十分清晰醒目,集成了Xbox Live游戏和Zune音乐功能,可见Windows Phone 7对游戏功能和社交功能的重视。 (5)Symbian是为手机而设计的实时多任务32位操作系统,它的功效低,内存占用少,提供了开发使用的函数库、用户界面、通用工具和参考示例。操作系统不是完全开放的,核心代码不开放,但是API文档是公开的。 (6)黑莓系统主要在黑莓手机上使用,其特色是支持电子邮件推送功能,邮件服务器主动将收到的邮件推送到用户的手持设备上,而不需要用户频繁地连接网络查看是否有新邮件。同时,黑莓系统提供手提电话、文字短信、互联网传真、网页浏览及其它无线信息服务功能。黑莓系统主要针对商务应用,具有很高的安全性和可靠性。 (7)PalmOS由拥有较多的第三方软件,是32位的嵌入式操作系统,主要在移动终端上使用,操作系统本身所占的内存极小,不具备录音和MP3播放功能。 (8)Linux手机操作系统具有开放源代码的特性,但是也包含入门难度高,集成开发环境差,Linux的产品与个人计算机的连接性较差,具有较强的开发实力的公司很少等不足。 2.简述Android平台的特征

android布局属性详解

RelativeLayout用到的一些重要的属性: 第一类:属性值为true或false android:layout_centerHrizontal 水平居中 android:layout_centerVertical 垂直居中 android:layout_centerInparent 相对于父元素完全居中 android:layout_alignParentBottom 贴紧父元素的下边缘 android:layout_alignParentLeft 贴紧父元素的左边缘 android:layout_alignParentRight 贴紧父元素的右边缘 android:layout_alignParentTop 贴紧父元素的上边缘 android:layout_alignWithParentIfMissing 如果对应的兄弟元素找不到的话就以父元素做参照物 第二类:属性值必须为id的引用名“@id/id-name” android:layout_below 在某元素的下方 android:layout_above 在某元素的的上方 android:layout_toLeftOf 在某元素的左边 android:layout_toRightOf 在某元素的右边 android:layout_alignTop 本元素的上边缘和某元素的的上边缘对齐 android:layout_alignLeft 本元素的左边缘和某元素的的左边缘对齐 android:layout_alignBottom 本元素的下边缘和某元素的的下边缘对齐 android:layout_alignRight 本元素的右边缘和某元素的的右边缘对齐 第三类:属性值为具体的像素值,如30dip,40px android:layout_marginBottom 离某元素底边缘的距离 android:layout_marginLeft 离某元素左边缘的距离 android:layout_marginRight 离某元素右边缘的距离 android:layout_marginTop 离某元素上边缘的距离 EditText的android:hint 设置EditText为空时输入框内的提示信息。 android:gravity android:gravity属性是对该view 内容的限定.比如一个button 上面的text. 你可以设置该text 在view的靠左,靠右等位置.以button为例,android:gravity="right"则button上面的文字靠右 android:layout_gravity android:layout_gravity是用来设置该view相对与起父view 的位置.比如一个button 在

用 Eclipse 开发 Android 应用程序

在 Eclipse 环境中进行 Android 应用程序开发 开始之前 本教程介绍如何在 Eclipse 环境中进行 Android 应用程序开发,包括两个示例应用程序。第一个示例是一个基本的应用程序,涉及构建和调试的所有阶段。第二个应用程序示例涉及比较复杂的 Android 特性,包括联系人搜索和 Google Maps 地址查找。要想从本教程获得最大收益,具备移动开发经验会有帮助,但不是必需的。开发 Android 应用程序需要Java? 编程技能,但是对于本教程不是必需的。 关于本教程 我们为什么要关注 Android?有两个原因使 Android 成为重要的平台。首先,Google 引入了 Android,它在很短时间内就获得了市场的关注。Google 正在进军移动市场。它在这个市场上采取的第一个行动就是发布 Android 和 Open Handset Alliance,这是一个令人印象深刻的起点。第二,Android 不仅仅是另一种包含电话、菜单和触摸屏功能的移动平台。您将在本教程中了解到,Android 提供了一种不同的应用程序开发方法。由于可以对请求的操作和代码进行运行时绑定,Android 的体系结构支持高度可定制的软件环境。无论是考虑市场因素还是 Android 的技术方面,它都是一个值得研究的平台。 本教程分为以下几节: ?Android 基础知识和必需的工具 ?Android Software Developer Kit ?构建和调试 SaySomething Android 应用程序 ?创建内容提供器和 Google Maps 应用程序 系统需求 本教程需要结合使用几种技术。 Eclipse 平台Eclipse 是一个运行插件的平台。您应该安装 Eclipse Classic 的最新版本(本教程使用 V3.3.1)。Android Developer Tools按照安装 Android SDK中的说明安装 Android Developer Tools(Eclipse 插件)。 源代码本教程中的源代码片段包括: ?AndroidManifest.xml(片段)—这个文件是 Android 应用程序的应用程序部署描述符。 ?IntentReceiver —演示 IntentReceiver 的实现,这个类处理 AndroidManifest.xml 文件中 IntentFilter 标记所公布的 intent。 ?SaySomething.java —实现一个 Android 活动,这是本教程的示例应用程序的主要入口点。 ?Main.xml —这个文件包含 Android 活动所用的视觉元素或资源。 ?R.java —这个文件是由 Android Developer Tools 自动生成的,它把视觉资源“连接” 到 Java 源代码。 ?AndroidManifest.xml(完整)—这是完整的 AndroidManfest.xml 文件,包含每个重要元素的描述。

Android应用开发基础习题

-- 任务一Android 开发环境的搭建 第一部分知识回顾与思考 1.Android 的四层架构分别包括哪几层?分别起到什么作用? 答:Linux 内核层(Linux Kernel ):基于Linux 内核,内核为上层系统提供了系统服务。 系统库层(Libraries ):系统库基于C/C++ 语言实现,通过接口向应用程序框架层提供编程接口。 应用框架层(Application Framework ):为开发者提供了一系列的Java API,包括图形用户界面组件

View 、SQLite 数据库相关的API 、Service 组件等。 应用程序层(Applications ):包含了Android 平台中各式各样的应用程序。 第二部分职业能力训练 一、单项选择题(下列答案中有一项是正确的,将正确答案填入括号内) 1.Android 四层架构中,应用框架层使用的是什么语法?(C)A .CB .C++C.Java D.Android 2.Android 四层架构中,系统库层使用的是什么语法?(B)A .VBB.C /C++C.Java D .Android 3.应用程序员编写的Android 应用程序,主要是调用(B)提供的接口进行实现。 A .应用程序层DCB.应用框架层.应用视图层.系统库层

二、填空题(请在括号内填空) 1.在Android 智能终端中,有很多应用如拍照软件、联系人管理软件,它们都属于Android 的(应用程 序)层。 2.为了让程序员更加方便的运行调试程序,Android 提供了(模拟器),可以方便的将程序运行其上, 而不要实际的移动终端。 程序运行,我们需要安装(Java 3.为了支持)。JDK 三、简答题 1.简述Android 开发环境安装的步骤。 答:下载并安装JDK ,配置JDK 的环境变量; 从Anroid 官网上下载Android 开发组件(包含Eclipse 和

Android 开发之旅-view的几种布局方式及实践

Android 开发之旅:view的几种布局方式及实践 https://www.doczj.com/doc/f412200453.html,/1943397/363552 2010-06-06 14:14:00 标签:布局 View 实践移动开发 Android 原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。否则将追究法律责任。 https://www.doczj.com/doc/f412200453.html,/1943397/363552 引言 通过前面两篇: 1.Android 开发之旅:又见Hello World! 2.Android 开发之旅:深入分析布局文件&又是“Hello World!” 我们对Android应用程序运行原理及布局文件可谓有了比较深刻的认识和理解,并且用“Hello World!”程序来实践证明了。在继续深入Android开发之旅之前,有必要解决前两篇中没有介绍的遗留问题:View的几种布局显示方法,以后就不会在针对布局方面做过多的介绍。View的布局显示方式有下面几种:线性布局(Linear Layout)、相对布局(Relative Layout)、表格布局(Table Layout)、网格视图(Grid View)、标签布局(Tab Layout)、列表视图(List View)、绝对布局(AbsoluteLayout)。本文虽然是介绍View的布局方式,但不仅仅是这样,其中涉及了很多小的知识点,绝对能给你带来Android大餐! 本文的主要内容就是分别介绍以上视图的七种布局显示方式效果及实现,大纲如下: 1.1、View布局概述 2.2、线性布局(Linear Layout) 1. 2.1、Tips:android:layout_weight="1" 3.3、相对布局(Relative Layout) 4.4、表格布局(Table Layout) 5.5、列表视图(List View) 1. 5.1、一个小的改进 2. 5.2、补充说明 6.6、网格视图(Grid View) 7.7 、绝对布局() 8.8、标签布局(Tab Layout) 1、view的布局显示概述 通过前面的学习我们知道:在一个Android应用程序中,用户界面通过View和ViewGroup对象构建。Android中有很多种View和ViewGroup,他们都继承自View类。View对象是Android平台上表示用户界面的基本单元。 View的布局显示方式直接影响用户界面,View的布局方式是指一组View元素如何布局,准确的说是一个ViewGroup中包含的一些View怎么样布局。ViewGroup类是布局(layout)和视图容器(View container)的基类,此类也定义了https://www.doczj.com/doc/f412200453.html,youtParams类,它作为布局参数的基类,此类告诉父视图其中的子视图想如何显示。例如,XML布局文件中名为layout_something的属性(参加上篇的4.2节)。我们要介绍的View的布局方式的类,都是直接或间接继承自ViewGroup类,如下图所示:

android程序设计

一、填空题 1、下列哪个不是Activity的生命周期方法之一() A. onCreate B. startActivity C. onStart D. onResume 2、下列用于进行文本输入的组件是() A、TextView B、Button C、EditText D、Label 3、下面哪个不是Android的界面布局方式() A、BorderLayout B、LinearLayout C、TableLayout D、RelativeLayout 4、下列不是手机操作系统的是( ) A. Android B. Window Mobile C. Apple IPhone IOS D.windows vista 5、定义LinearLayout垂直方向布局时设置的属性是() A.android:layout_height B.android:gravity C.android:layout D. android:orientation vertical 6、Android 项目工程下面的assets 目录的作用是什么( ) A、放置应用到的图片资源。Res/drawable B、主要放置一些文件资源,这些文件会被原封不动打包到apk 里面 C、放置字符串,颜色,数组等常量数据res/values D、放置一些与UI相应的布局文件,都是xml 文件res/layout 11、在XML布局 7、跳转到另一个Activity的方法是( ) A.runActivity() B.goActivity() C.startActivity() D.startActivityForIn() 8、用于进行文字显示的组件是( ) A.TextView B.Button C.EditText https://www.doczj.com/doc/f412200453.html,bel 9、下面退出Activity错误的方法是() A.finish() B.抛异常强制退出

Android应用开发试题

Android应用开发试题 一、选择题(每题2分,共30分) 1. 下列不是手机操作系统的是?(D) A.Android B. Window Mobile C. Apple IPhone IOS D.windows vista 2.Android的VM虚拟机是哪个?A A.Dalvik B.JVM C.KVM D.framework 3. AndroidVM虚拟机中运行的文件的后缀名为(B) A.class B.apk C.dex D.xml 4. 下面关于Android DVM的进程和Liunx的进程,应用程序的进程说法正确的是 A.DVM指dalivk的虚拟机.每一个Android应用程序都在自己的进程中运行,不一定拥有一个独立的Dalvik虚拟机实例,而每一个DVM都是在Liunx中的一个进程,所以说可以认为是同一个概念。B B.DVM指dalivk的虚拟机.每一个Android应用程序都在自己的进程中运行,不一定拥有一个独立的Dalvik虚拟机实例,而每一个DVM不一定都是在Liunx 中的一个进程,所以说可以认为不是一个概念。 C.DVM指dalivk的虚拟机.每一个Android应用程序都在自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例,而每一个DVM不一定都是在Liunx中的一个进程,所以说可以认为不是同一个概念。 D.DVM指dalivk的虚拟机.每一个Android应用程序都在自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例,而每一个DVM都是在Liunx中的一个进程,所以说可以认为是同一个概念。 5. 下列哪个可做EditText编辑框的提示信息?(D) A. android:inputType B. android:text C. android:digits D. android:hint 6. 在AndroidManifes.xml中描述一个Activity时,该Activity的label属性是指定什么( B) A.指定Activity的图标 B.指定Activity的显示图标 C.指定Activity和类相关联的类名 D.指定该Activity的唯一标识 7. 关于ContentValues类说法正确的是( A ) A.它和Hashtable比较类似,也是负责存储一些名值对,但是它存储的名值对当中的名是String类型,而值都是基本类型。 B.它和Hashtable比较类似,也是负责存储一些名值对,但是它存储的名值对当中的名是任意类型,而值都是基本类型。 C.它和Hashtable比较类似,也是负责存储一些名值对,但是它存储的名值对当中的名可以使空,而值都是String类型。 D.它和Hashtable比较类似,也是负责存储一些名值对,但是它存储的名值对当中的名是String类型,而值也是String类型。 8. Activity对一些资源以及状态的操作保存,最好是保存在生命周期的哪个函数中进行( A) A.onPause() B.onCreate() C.onResume() D.onStart 9. 下列哪个不是Activity的生命周期方法之一?(B) A. onCreate B. startActivity C. onStart D. onResume 10.如果在android应用程序中需要发送短信,那么需要在AndroidManifest.xml文件中增加什么样的权限( D). A.发送短信,无需配置权限

Android程序设计练习卷答案

1.在android程序中,Log.d()用于输出什么级别的日志信息?(A) A、调试 B、信息 C、警告 D、错误 2.以下情况不会创建Context对象的是(C) A.创建Application 对象时 B.创建Service对象时 C.创建ContentProvider对象时 D.创建Activity对象时 3.下列不属于Android中广播中的类别的是(D) A.Normal Broadcas B.Sticky Broadcast C.Local Broadcast D.Order broadcast 4.以下哪个不是Intent的Activity启动方式(A) A.FLAG_ACTIVITY_BROUGHT_TO_FIRST B.FLAG_ACTIVITY_CLEAR_TOP C.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET D.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 5.安卓AndroidManifest.xml文件的子节点不包括(C) A.application B.services C.permission D.provider 6.下面那个不是Fragment的生命周期方法(D) A. onStart B. onAttach C. onDestoryView D. onRestart 7.下面那种不是安卓原生支持的Menu(A) A.Selected Menu B.Option Menu C.Submenu D.Context Menu 8.下面不属于android的动画分类的有(D) A、Tween B、Frame C、Property D、Animation 9.下列哪个不是安卓service自带的方法(A) A.OnResume B.onCreate C.onStartCommand D.onRebind 10.下列属于SAX解析xml文件的优点的是(B) A、将整个文档树在内存中,便于操作,支持删除,修改,重新排列等多种功能 B、不用事先调入整个文档,占用资源少 C、整个文档调入内存,浪费时间和空间 D、不是长久驻留在内存,数据不是持久的,事件过后,若没有保存数据,数据就会消失 11.下列关于Soundpool和MediaPlayer的说法,错误的是(A) A.MediaPlayer支持多个音乐同时播放 B.MediaPlayer资源占用率高 C.MediaPlayer延迟时间较长 D.new MediaPlayer()后要调用prepare()方法才能播放 12.关于res/raw目录说法正确的是(A) A、这里的文件是原封不动的存储到设备上不会转换为二进制的格式

Android七种布局解析

我们对Android应用程序运行原理及布局文件可谓有了比较深刻的认识和理解,并且用“Hello World!” 程序来实践证明了。在继续深入Android开发之旅之前,有必要解决前两篇中没有介绍的遗留问题:View 的几种布局显示方法,以后就不会在针对布局方面做过多的介绍。View的布局显示方式有下面几种: 线性布局(Linear Layout)、 相对布局(Relative Layout)、 表格布局(Table Layout)、 网格视图(Grid View)、 标签布局(Tab Layout)、 列表视图(List View)、 绝对布局(AbsoluteLayout)。本文虽然是介绍View的布局方式,但不仅仅是这样,其中涉及了很多小的知识点,绝对能给你带来Android大餐! 本文的主要内容就是分别介绍以上视图的七种布局显示方式效果及实现,大纲如下: ?1、View布局概述 ?2、线性布局(Linear Layout) o 2.1、Tips:android:layout_weight="1" ?3、相对布局(Relative Layout) ?4、表格布局(Table Layout) ?5、列表视图(List View) o 5.1、一个小的改进 o 5.2、补充说明 ?6、网格视图(Grid View) ?7 、绝对布局() ?8、标签布局(Tab Layout) 1、view的布局显示概述 通过前面的学习我们知道:在一个Android应用程序中,用户界面通过View和ViewGroup对象构建。A ndroid中有很多种View和ViewGroup,他们都继承自View类。View对象是Android平台上表示用户界面的基本单元。 View的布局显示方式直接影响用户界面,View的布局方式是指一组View元素如何布局,准确的说是一个ViewGroup中包含的一些View怎么样布局。ViewGroup类是布局(layout)和视图容器(View containe r)的基类,此类也定义了https://www.doczj.com/doc/f412200453.html,youtParams类,它作为布局参数的基类,此 类告诉父视图其中的子视图想如何显示。例如,XML布局文件中名为layout_so mething的属性(参加上篇的4.2节)。我们要介绍的View的布局方式的类,都是直接或间接继承自ViewGroup类,如下图所示:

Android应用程序开发个人总结

Android应用程序开发个人总结 Android应用程序开发个人总结范文 篇一:Android应用程序开发-个人总结 一、项目简介: 送祝福App是一款逢年过节为方便发送祝福信息的软件,并且介绍各种节日的相关情况。包含节日祝福短信,支持直接发送短信给好友,也可定时发送给好友,编写模版。为生活提供了便利。 二、个人在项目中承担的任务: 我是任务是整合成员负责的模块,把各个模块整合到一起,然后把主界面的效果做出来,主界面参考的是微信的界面 三、学习本门课程收获、体会及建议: 在本门课程中,我初步认识了安卓应用开发所需基本知识,比如安装体系结构,常用的控件以及API的使用方法,知道了安卓体系存储数据的方式。这一学期,安卓相关的知识自己掌握的不多,不过也透过安卓课程看到移动端应用的火热。这一个学期里,老师讲得比较细,自己单独下来练一个知识点了,也可以,不过当几个知识点的内容整合到一起,自己就凌乱了,自己的思路就不清晰。在期末项目中,我是任务是整合成员负责的模块,把各个模块整合到一起,然后把主界面的效果做出来,主界面参考的是微信的界面,由于时间和能力的限制,只完成了部分功能,功能没有完全实现。 篇二:Android程序员-201*年度个人工作总结和计划

逝者如斯夫,不舍昼夜!转眼间,自己在XX网里参加工作已经有一年有余了。回首即将逝去的201*年,可以说是平淡而不普通的一年,发现自己在各方面都比上一年有所进步、提高。一年的结束孕育着新一年的到来,新的一年意味着新的起点、新的挑战。昂首期待未来,总结以往经验。在新一年来临之际,我现把这一年的工作总结一下以及将新一年计划列一下。 大概3月份左右,XXXXApp第一期基本开发完成比较稳定的版本。在此之前,我主要负责参考XXXXApp的Android客户端的开发工作。XXXX第一期开发的难度系数相对比较低,开发起来还是相对的容易,所学到的基础知识基本上可以开发出来。我个人认为当时的开发效率还是比较低的,这里说的是整个项目的开发效率,不是个人负责工作的完成效率,换句话来说是团队的整体开发效率不高,没有达到高效。这个也许是团队协调与沟通交流还存在不足的地方。XXXXApp实际上基本可以满足用户的使用(表面),但是项目的代码管理(本质)比较杂乱、扩展性差、健壮性也不错、兼容性也不算好。这无疑导致开发的工作量大大的增加。产生这些问题的原因有团队的项目开发经验缺乏,有自己个人的开发水平有限、技能不足。简言之,我的专业技能还不够强。 在3月份之前,公司聘请了外包团队与我们的团队一起开发问答App。公司的目的培训公司的团队,让我们学习外包团队的技能。在外包团队的参与和指导下问答App开发工作相当顺利,团队的分工清晰、交流充分、协调都比较好。问答App的工作接近尾声,意味着XXX

Android应用程序开发(第二版)课后习题答案

第一章Android简介 1.简述各种手机操作系统的特点. 答案: 目前,手机上的操作系统主要包括以下几种,分别是Android、iOS、Windows Mobile、Windows Phone 7、Symbian、黑莓、PalmOS和Linux。 (1)Android是谷歌发布的基于Linux的开源手机平台,该平台由操作系统、中间件、用户界面和应用软件组成,是第一个可以完全定制、免费、开放的手机平台。Android底层使用开源的Linux操作系统,同时开放了应用程序开发工具,使所有程序开发人员都在统一、开放的开发平台上进行开发,保证了Android应用程序的可移植性。 (2)iOS是由苹果公司为iPhone、iPod touch、iPad以及Apple TV开发的操作系统,以开放源代码的操作系统Darwin为基础,提供了SDK,iOS操作系统具有多点触摸操作的特点,支持的控制方法包括滑动、轻按、挤压和旋转, 允许系统界面根据屏幕的方向而改变方向,自带大量的应用程序。 (3)Windows Mobile是微软推出的移动设备操作系统,对硬件配置要求较高,一般需要使用高主频的嵌入式处理器,从而产生了耗电量大、电池续航时间短和硬件成本高等缺点,Windows Mobile系列操作系统包括Smartphone、Pocket PC和Portable Media Center。随着Windows Phone 7的出现,Windows Mobile 正逐渐走出历史舞台。 (4)Windows Phone 7具有独特的“方格子”用户界面,非常简洁,黑色背景下的亮蓝色方形图标,显得十分清晰醒目,集成了Xbox Live游戏和Zune音乐功能,可见Windows Phone 7对游戏功能和社交功能的重视。 (5)Symbian是为手机而设计的实时多任务32位操作系统,它的功效低,内存占用少,提供了开发使用的函数库、用户界面、通用工具和参考示例。操作系统不是完全开放的,核心代码不开放,但是API文档是公开的。 (6)黑莓系统主要在黑莓手机上使用,其特色是支持电子邮件推送功能,邮件服务器主动将收到的邮件推送到用户的手持设备上,而不需要用户频繁地连接网络查看是否有新邮件。同时,黑莓系统提供手提电话、文字短信、互联网传真、网页浏览及其它无线信息服务功能。黑莓系统主要针对商务应用,具有很高的安全性和可靠性。 (7)PalmOS由拥有较多的第三方软件,是32位的嵌入式操作系统,主要在移动终端上使用,操作系统本身所占的内存极小,不具备录音和MP3播放功能。 (8)Linux手机操作系统具有开放源代码的特性,但是也包含入门难度高,集成开发环境差,Linux的产品与个人计算机的连接性较差,具有较强的开发实力的公司很少等不足。 2.简述Android平台的特征 答案: Android广泛支持GSM、3G和4G的语音与数据业务,支持接收语言呼叫和SMS

android布局layout中的一些属性(DOC)

android布局layout中的一些属性 1、可以使某些资源文件或UI组件可重用 2、定义一个文本编辑框,使用绝对定位 android:layout_x="20dip" android:layout_y="80dip" 3、控件位置 android:layout_centerHorizontal 控制该组件是否位于布局容器的水平居中位置android:layout_centerVertical 控制该组件是否位于布局容器的垂直居中位置android:layout_centerInParent 控制该组件是否位于布局容器的中央位置 android:layout_alignParentBottom 控制该组件是否与布局容器底端对齐 android:layout_alignParentLeft 控制该组件是否与布局容器左边对齐 android:layout_alignParentRight 控制该组件是否与布局容器右边对齐 android:layout_alignParentTop 控制该组件是否与布局容器顶端对齐 android:layout_toRightOf 控制该组件位于给出的ID组件的右侧 android:layout_toLeftOf 控制该组件位于给出的ID组件的左侧 android:layout_above 控制该组件位于给出的ID组件的上方 android:layout_below 控制该组件位于给出的ID组件的下方 android:layout_alignTop 控制该组件与给出的ID组件的上边界对齐 android:layout_alignBottom 控制该组件与给出的ID组件的下边界对齐 android:layout_alignLeft 控制该组件与给出的ID组件的左边界对齐 android:layout_alignRight 控制该组件与给出的ID组件的右边界对齐 4、设置单元格内的控件的形状(可压缩,可伸长,可隐藏等) android:shrinkColumns 设置该列的所有单元格的宽度可以被收缩,以保证该表格能够适应父容器宽度 android:stretchColumns 设置该列的所有单元格的宽度可以被拉伸,以保证组件能完全填满表格空余空间 android:collapseColumns 设置该列的所有单元格会被隐藏 5、TextView属性设置 设置字体为30pt android:textSize="30pt" 设置中间省略android:singleLine="true"android:ellipsize="middle" 对邮件增加链接android:autoLink="email"android:autoLink="email" 测试密码框android:password="true" 绘制一张图片android:drawableLeft="@drawable/icon" 6、EditText属性设置 当前组件在得到焦点的时候,自动选取该组件内的所有的文本内容 android:selectAllOnFocus="true"

本科毕业设计--基于android平台的手机应用软件设计与实现

安阳工学院 计算机科学与工程学院 JAVA程序设计课程综合项目报告 项目题目:基于Android平台的手机应用软件设计与实现专业班级:计算机科学与技术(信息技术)11-1 学生姓名:吕鹏 学生学号:201103010042 指导教师姓名:许研 2013年12月

摘要 随着IT技术的发展,移动开发已被广泛的应用于社会的各个领域,成为推动社会发展的技术动力。而在移动开发中,Android开发近些年来突飞猛进的发展,在智能手机领域中的市场份额以及超过80%。同样,基于安卓平台的手机应用开发也达到前所未有的高度,各种安卓手机应用软件竞相出现。本次的JAVA 课程设计将基于安卓的平台,因为安卓开发主要基于JAVA语言和XML语言。本次所做的手机应用软件,可实现系统的登录、计算器、打电话、发短信、上网等简单功能实现。在此系统的实现过程中不仅提高了JAVA语言编程,而且加入了Android的成分,提高了软件设计的兴趣性。 关键词:手机应用软件开发,Java程序设计语言,Android开发。

目录 摘要 (2) 第1章系统目标 (5) 第2章系统功能介绍 (6) 2.1系统功能总框图 (6) 2.2 模块功能介绍 (6) 2.2.1 登录模块功能介绍 (6) 2.2.2 等待模块功能介绍 (7) 2.2.3系统主界面模块功能介绍 (8) 2.2.4短信和拨号模块功能介绍 (8) 2.2.5计算器模块功能介绍 (9) 2.2.6网上冲浪模块功能介绍 (10) 第三章系统功能实现 (11) 3.1 系统登录模块设计 (11) 3.1.1 登录框布局设计 (11) 3.1.2 登录对话框设计 (13) 3.2 等待模块设计 (15) 3.3 系统主界面模块设计 (16) 3.3.1 主界面XML布局设计 (16) 3.3.2 主界面背景图片设计 (18) 3.3.3 主界面功能实现设计 (18) 3.4 短信和拨号模块设计 (20) 3.4.1短信功能实现设计 (20) 3.4.2 拨号功能实现设计 (22) 3.5 计算器模块设计 (22) 3.5.1 计算器界面设计 (22) 3.5.2 计算器功能实现设计 (22) 3.6 网上冲浪模块设计 (24) 3.6.1 网上冲浪模块XML布局设计 (24)

Android程序设计练习卷答案

1.在android程序中,()用于输出什么级别的日志信息(A) A、调试 B、信息 C、警告 D、错误 2.以下情况不会创建Context对象的是(C) A.创建Application 对象时 B.创建Service对象时 C.创建ContentProvider对象时 D.创建Activity对象时 ] 3.下列不属于Android中广播中的类别的是(D) Broadcas Broadcast Broadcast broadcast 4.以下哪个不是Intent的Activity启动方式(A) 5.安卓文件的子节点不包括(C) & 6.下面那个不是Fragment的生命周期方法(D) A. onStart B. onAttach C. onDestoryView D. onRestart 7.下面那种不是安卓原生支持的Menu(A) Menu Menu Menu ( 8.下面不属于android的动画分类的有(D) A、Tween B、Frame C、Property D、Animation 9.下列哪个不是安卓service自带的方法(A) A.OnResume 10.下列属于SAX解析xml文件的优点的是(B) @ A、将整个文档树在内存中,便于操作,支持删除,修改,重新排列等多种功能 B、不用事先调入整个文档,占用资源少 C、整个文档调入内存,浪费时间和空间 D、不是长久驻留在内存,数据不是持久的,事件过后,若没有保存数据,数据就会消失 11.下列关于Soundpool和MediaPlayer的说法,错误的是(A) 支持多个音乐同时播放 资源占用率高 { 延迟时间较长

Android开发TableLayout属性介绍

在android开发中,常见的布局方式有:LinearLayout (线性布局),RelativeLayout (相对布局),TableLayout (表格布局),AbsoluteLayout (绝对布局),FrameLayout (帧布局),今天我们主要介绍表格布局的相关属性。 TableLayout经常用到的属性有: android:collapseColumns:以第0行为序,隐藏指定的列: android:collapseColumns该属性为空时,效果如下图: 把android:collapseColumns=0,2--------------》意思是把第0和第2列去掉,如下图: android:shrinkColumns:以第0行为序,自动延伸指定的列填充可用部分: 当LayoutRow里面的控件还没有布满布局时,shrinkColumns不起作用,如下图: 设置了shrinkColumns=0,1,2,布局完全没有改变,因为LayoutRow里面还剩足够的空间。当LayoutRow布满控件时,如下图: 设置设置了shrinkColumns=2,则结果如下图,控件自动向垂直方向填充空间:

android:stretchColumns:以第0行为序,尽量把指定的列填充空白部分: 设置stretchColumns=1,则结果如下图,第1列被尽量填充(Button02与TextView02同时向右填充,直到TextView03被压挤到最后边)。 更多android开发视频入门教程,点此查看>> https://www.doczj.com/doc/f412200453.html,/course/2/。

Android程序开发实验报告

山西大学 物理电子工程学院 论文题目:基于Android系统的GPS 程序开发 学号:* 姓名:* * * 指导老师:* *

摘要 在日常生活中,我们经常需要知道自己的具体位置,尤其是在 旅游或陌生城市中。而手机作为目前最常见、最方便的电子信息载体,无疑是我们最好的选择。为了让智能手机用户能够随时随地查询GPS 所提供的服务,一种高效的办法就是将应用系统的功能拓展到手机终端上。本文选择的是最常见的Android系统的程序开发。对于软件从业人员来说,该平台具有无限的吸引力。 因此,本文首先介绍安卓系统在个人计算机上开发平台的搭建,并尝试在安卓系统上开发一款基于手机自带GPS组件的GPS应用。 关键字:Android,GPS,SDK,JDK,ADT,Eclipse 一引言 (一)开发背景 随着网络世界的深入生活,地球网络化已经是一条必然之路。而今后的网络也将逐渐的走向移动互联网的轨道。像手机,平板计算机,笔记本计算机等可以搭乘移动互联网的产品中使用人数最多的数码产品便是智能手机了。它已经在逐步的取代其他的电子产品的市场份额。据《2013-2017年中国智能手机行业市场需求预测与投资战略规划分析报告》估算,2012前三季度,全球智能手机用户总数已经突破了10亿大关。而2011前三季度的用户量只有约7亿户。可以看出,智能手机市场的潜力不可估量。

(二)Android 与GPS 简介 1.Android 是一种基于Linux 的自由及开放源代码的操作系统,主要使用于移动设 备,如智能手机和平板计算机,由Google 公 司和开放手机联盟领导及开发。 2011年第一季度,Android 在全球的市场份额首次超过塞班系统,跃居全球第一。 2012年11月数据显示,Android 占据全球智能手机操作系统市场76%的份额,中国市场占有率为90%。 Android 的系统架构和其操作系统一 样,采用了分层的架构。从架构图看, Android 分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运 行库层和Linux 内核层。 Android 系统所具有的特点有:开放性、丰富的硬件、方便开发。 2.GPS 是英文Global Positioning System (全球定位系统) 的简称。GPS 起始于1958年美国军方的一个项目, 1964年投入使用。GPS 定位的基本原理是根据高速运动的卫星瞬间位置作为已知的起算数据,采用空间距离后方交会的方法,确定待测点的位置。GPS 由空间部分、地面控制系统、用户设备部分三部分组成。作为先进的测量手段和新的生产力,GPS 已经融入了国民经济建设、国防建设和社会发展的各个应用领域。GPS 技术与我们的日常生活日益相关。

相关主题
文本预览
相关文档 最新文档