Android应用基础学习记录

 

01_前言

前言,了解了Android的情况。这里也介绍一下本文,本文是记录学习Android应用程序开发过程,视频中使用的Android2.2版本,我以4.2版本为基础,找出其中的差异并记录下来。会不断的更新。一直苦于编写后底层代码后,需要编写Apk来测试,所以学的Android应用。

记录时环境记录:

系统环境:Ubuntu 12.10

    Eclipse:   ingigo-sr2

       Adt  :    22.3


02_搭建Android开发环境

我用的是Ubuntu,所以有了这文章:

一.Eclipse的安装

安装Eclipse有两种方法:1.apt-get install eclipse 2.下载安装包。如果采用第一种方法安装的Eclipse在进行下面的步骤时遇到错误,别和错误计较,赶紧采用第二种安装方法重新安装Eclipse。关于Eclipse版本的选择,我选用eclipse-java-indigo-SR2-linux-gtk.tar.gz3.7的用的时候出现解析xml极为卡的问题。

 

二.ADT的安装

ADT推荐离线安装,版本我选择的是ADT-22.3.0.zip,我是选择过22.6.*不好用的之后才回退到22.3.0的。这个真心好用。这里简单说下22.6.*版本出现的问题:1.会默认创建fragment_main.xml 2.如果要兼容2.3的程序每个应用会多出一个附带应用appcompat_v7。导入ADTzip包的时候,不要勾选在线检测

 

三.SDK的安装

SDK选择和ADT配套版本:android-sdk_r22.3-linux.tgz。用起来感觉还不错!下载其它SDK包的时候不建议将SDK更新到22.6.*版本。应用开发版本选择4.2。虚拟机的话,不建议用4.4的,4.4的容易崩溃。

 

03_创建与启动手机模拟器和学习使用ANDROID操作系统

一.如果实在要使用模拟器,注意以下几点

1.不想让模拟器占满屏幕,手动启动并设置大小

2.想要模拟器运行的快一些选择x86版本CPU(似乎目前只有4.4的可以支持)

3.模拟器能调试的功能有:(列出以前认为不能调试的东西)

  A.拨号

 B...

4.老罗的博客上有更多关于模拟器的使用。

 

二.如何使用真机

1.经常使用adb,将adb添加到环境变量中。不推荐使用apt-get install android-platform-tools安装。

2.连接真机参考《Linux下安装Androidadb驱动-解决不能识别的问题》。

 

三.关于通过Wifi调试Android设备

1.有两种方法:1.连接到普通的无线路由;2.Ubuntu设置wifi无线热点+Android手机如何搜索连接到共享网络+补丁

2.重新挂载文件系统《Android修改system只读权限:remount

3.ADB调试《Android中使用WIFI来连接ADB

 

关于使用

.......


4_开发运行第一个应用程序

关于apk的安装,如果采用命令行的话,我使用的是:

$ adb push Test.apk /data/app

我且称它为覆盖安装,即如果已经存在该apk,直接覆盖不用再执行adb uninstall。


05_项目的目录结构与安装及启动过程分析

1.关于res/drawable-*目录

   在Eclipse中你放到drawable-*任意目录放入图片资源,在编译时都能找到,但是如果在Android源码中编译,一定要放到drawable-ldpi中才可以编译通过,否则不能编译柔肠通过。如果你想程序可以同时可以在EclipseAndroid源码中成功编译那么就请把图片资源放到drawable-ldpi中。

 

2.关于string.xml

   如果软件没有考虑到语言国际化或者关键实现代码逻辑而非界面,那么有可能直接字串到Activity.xml中,这样在Eclipse中编译是ok了,但是在Android源码中编译是闷骚地不过关的,会严格不允许这样做的,只能在Android.mk中添加LOCAL_MODULE_TAGS := tests才可以编译过。


06_电话拔号器

1.隐藏启动列表中的应用图标

术语:禁止luncher启动apk。注释一行:

<!--<category android:name="android.intent.category.LAUNCHER"/> -->

2.id/变量命名规则

1)Xml文件中:

     开头是注释用“Cpies”(功能名)。labelForcopies_edittext(功能名+edittext-无需要改变的TextView可以不用id,但是用的话就是如下labelFor的名字),文字用”label_copies”(label+功能名)。(源码位置:这里

                  <!-- Copies -->

                <TextView

                    .....                    

                    android:labelFor="@+id/copies_edittext"

                    android:text="@string/label_copies">

                    .....

                </TextView>

 

2)变量名_idcopies_edittext为例(源码位置:这里

// Copies

mCopiesEditText = (EditText) findViewById(R.id.copies_edittext);

 

所以我觉得电话拨号器中的命令应该是:

MainActivity.java

main_activity.xml

string.xml

-

-

label_mobile_number

mMobileNumberEditText

mobile_number_edittext

-

mDialButton

dial_button

dial


(局部变量就无所谓了,这里intent

 

3)关于查看资料

            主页https://developer.android.com/

Permission:  reference/android/Manifest.permission.html(链接)

          Intent:  reference/android/content/Intent.html(链接

 

4)代码优化

拨号关键代码可以优化为如下

String number = mMobileNumberEditText.getText().toString();

Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + number));

startActivity(intent);


07_查看应用输出的错误信息与如何部署应用到真实手机

1关于手机驱动

连接到Linux上不需要额外驱动,直接修改adb的配置文件即可,不能识别参考《Linux下安装Androidadb驱动-解决不能识别的问题》。

Android Screen Monitor

这个软件同样实现了Linux版本,主页和下载地址。运行:

  $ java -jar asm.jar

就可以查看并操作手机了。


08_短信发送器

1.变量名

 


MainActivity.java

main_activity.xml

string.xml

-

-

app_name

-

-

label_mobile_number

mMobileNumberEditText

mobile_number_edittext

-

mSmsContentEditText

sms_content_edittext

-

mSendSmsButton

send_sms_button

send_sms



09_深入了解各种布局技术

1.四种布局 a.线形布局 b.相对布局 c.表格布局 d.帧布局

2.图片位置如果不做屏幕适配,建议放置到drawable-ldpi中。因为在系统源码中编译的应用,是去ldpi中找图片资源的。

 

10_对应用进行单元测试

这个着实是实用的,以前做一些业务类测试的时候都是使用在界面上实现一个按钮点击,由于是界面点击的,处理超时还会被警告超时关闭.单元测试确实是一个好方法,这点C语言的gdb都没有如此的强大.做一个模板,用到的时候直接测试:

1. copy this content into your AndroidManifest.xml

         <uses-library android:name="android.test.runner" />
    </application>
    <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:label="Demo for JUnittest"
        android:targetPackage="com.example.xml" />

2. Change [com.example.xml] to your current package name

3. Create a TestXXXService.java based AndroidTestCase.

11_查看与输出日志信息

1.Miui输出:Log too more...

2.

 

12_文件的保存与读取

没有实现界面,直接使用单元测试完成FileService的测试。ByteArrayOutputStream是第一次接触,解决了C语言中读文件不便利的问题。

13_文件的操作模式

关于MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE。

 

都在API-17(4.2.2)时给禁用了,可以使用java/io来解决:

    File f = new File(pdfPath);

file.setReadable(true, false); //使得该文件可以读

file.setWriteable(true, false); //使得该文件可以写

getCacheDir()方法获取当前包下的cache目录路径。

getFilesDir()方法获取当前包下的files目录路径。

14_把文件存放在SDCard

重点:

1.APK卸载后,这个APKSdcard中创建的目录和文件如何被删除掉呢?

2.不能使用mContext.openFileOutput();

3.4.2.2sdcard实质是/data/media/

4.放到sdcard中的文件可以被其它应用所读取

 

16_采用SharedPreferences保存用户偏好设置参数

例子:

public class PreferencesService {

    Context mContext = null;

 

    public PreferencesService(Context context) {

        mContext = context;

    }

 

    public void save(String name, Integer age) {

        SharedPreferences mSharedPreferences = mContext.getSharedPreferences("itcast", Context.MODE_PRIVATE);

        Editor mEditor = mSharedPreferences.edit();

        mEditor.putString("name", name);

        mEditor.putInt("age", age);

        mEditor.commit();

    }

    

    public Map<String, String> getPreferences() {

        Map<String, String> params = new HashMap<String, String>();

        SharedPreferences mSharedPreferences = mContext.getSharedPreferences("itcast", Context.MODE_PRIVATE);

        params.put("name", mSharedPreferences.getString("name"""));

        params.put("age", String.valueOf(mSharedPreferences.getInt("age", 0)));

        return params;

    }

 

}

 

17.

23_网络图片查看器

按照视频上写出来的代码在4.0上运行出现如下异常:

 android.os.NetworkOnMainThreadException

stackoverflow给出的建议是用AsyncTask,介于AsyncTask还没有学习,决定用新的线程还解决这个问题:

    /**

     * 下载线程

     */

    Runnable downloadRun = new Runnable() {

 

        @Override

        public void run() {

            try {

                String path = image_path.getText().toString();

                Log.i("FUCK""path:" + path);

                byte[] data = ImageService.getImage(path);

                bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);

 

                // 处理完成后给handler发送消息

                Message msg = new Message();

                msg.what = 1;

                handler.sendMessage(msg);

            } catch (Exception e) {

                e.printStackTrace();

            }

        }

    };

 

    private Handler handler = new Handler() {

        @Override

        public void handleMessage(Message msg) {

            if (msg.what == 1) {

                imageview.setImageBitmap(bitmap);

            }

        }

    };

将按键中处理的任务,放到一个新的线程中,按键后启动该线程:

        public void onClick(View v) {

            new Thread(downloadRun).start();

 

        }

当然处理图片显示的要放到Handler中显示。这样就解决了这个问题。

还有由于不关心Java Web开发,所以选择百度的Logo作为攻取图片的路径:

http://www.baidu.com/img/bdlogo.gif

显示结果如下:

 

52_发送状态栏通知

本课过程中,没有遇到错误,不过在发送通知的时候提示用的API已经过时了,所以找了一下新的使用方法:(参考)

原始API实现:

public void send(View v){

    String tickkerText = shorttitileText.getText().toString();

    String title = titleText.getText().toString();

    String content = contentText.getText().toString();

    int icon = android.R.drawable.stat_notify_chat;

    Notification notification = new Notification(icon, tickkerText, System.currentTimeMillis());

    Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:194949494"));

    PendingIntent pendingIntent = PendingIntent.getActivity(this, 10, intent, 0);

    notification.setLatestEventInfo(this, title, content, pendingIntent);

    notification.defaults = Notification.DEFAULT_SOUND;

    notification.flags = Notification.FLAG_AUTO_CANCEL;

    

    NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    manager.notify(100, notification);

}

API实现:

public void sendNew(View v){

    String tickkerText = shorttitileText.getText().toString();

    String title = titleText.getText().toString();

    String content = contentText.getText().toString();

    int icon = android.R.drawable.stat_notify_chat;

    Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:194949494"));

    PendingIntent pendingIntent = PendingIntent.getActivity(this, 10, intent, 0);

    Notification notification = new Notification.Builder(this)

    .setSmallIcon(icon)                   // => Notification         第一个参数

    .setTicker(tickkerText)                 // => Notification         第二个参数

    .setWhen(System.currentTimeMillis())   // => Notification         第三个参数

    .setContentTitle(title)                  // => setLatestEventInfo   第二个参数

    .setContentText(content)               // => setLatestEventInfo   第三个参数

    .setContentIntent(pendingIntent)        // => setLatestEventInfo   第四个参数

    .setDefaults(Notification.DEFAULT_SOUND)    

                          // => notification.defaults = Notification.DEFAULT_SOUND

    .setAutoCancel(true)                      

                          // => notification.flags = Notification.FLAG_AUTO_CANCEL

    .build();

    

    NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    manager.notify(100, notification);

}

 

学习OK。


53_采用网页设计软件界面

 

一般键盘的测试程序的界面就是用JS做出来的。网页要比xml布局容易一些,不过只适用简单一个的,比如表格等等。


54_tween动画

帮助文档路径:docs/guide/topics/resources/animation-resource.html

关于translate的文档例子没有错误了,默认会停留在移动结束后的位置;且使用

animation.setFillAfter(true);

无论true或者false都无效。学习OK。

55_frame动画的实现

在没有添加如下代码的时候,直接调用drawable.start()动画仍然是可以开始的:

        getMainLooper().myQueue().addIdleHandler(

                new MessageQueue.IdleHandler() {

 

                    @Override

                    public boolean queueIdle() {

                        drawable.start();

                        return false;

                    }

                });

关于getMainLooper().myQueue().addIdleHandler的具体作用有行研



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

袁保康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值