我的github: https://github.com/WHJWNAVY

安卓入门学习笔记

应用开发 Ann, Pepper 4360℃

本文由 胡椒小兄弟 原创,转载请注明出处。2015年8月31日星期一

安卓入门学习笔记

20150416
星期四 上午 10:19

  • 父类和子类的关系:类型包含关系。

    子类包含父类所有的方法和属性。

  • 继承是为了代码复用。

 

  • 安卓HelloWorld启动流程:

    1>根据AndroidManifest.xml找到com.wnavy.HelloWorld.MainActivity

    2>创建MainActivity类对象(反射)

    Activity
    activity = new MainActivity();

    3>通过对象调用OnCreate(……);//调用了MainActivity中的OnCreate函数(多态)

     

    public class MainActivity extends Activity

    {

    //入口函数

    @Override

    protected void onCreate(Bundle savedInstanceState)

    {

    //调用父类中被重写的OnCreate方法,做初始化工作

    super.onCreate(savedInstanceState);

    //根据activity_main.xml文件中的内容做出界面

    setContentView(R.layout.activity_main);

    }

    }

  • setContentView:

    setContentView(R.layout.activity_main);

    //根据传入的View类对象产生界面,其参数可以为任何View类的子类的对象,比如按钮,图片框……也可以是布局文件。

     

     

    • 颜色代码:

      ARGB用8为的十六进制数代表颜色与透明度。

      0xaaffbbcc

      aa:代表透明度

      ff:红色

      bb:绿色

      cc:蓝色

       

    • XML布局文件:

      <根标签>

      <子标签1 xxx>

      <子标签11 xxx/>

      </子标签1>

      <子标签2

      xxx

      xxx

      />

      </根标签>

     

    • 长度单位:

      1>fill_partent, wrap_content

      2>sp–>文字大小,40sp

      3>dp–>100dp

       

    • 监听器:监听事件的对象。

      事件:点击、长按、短按……

      事件源:点击的对象就是事件源。

       

    • 创建监听器步骤:

      –>取出事件源对象

      Button bt = (Button) this.findViewById(R.id.button1);

      –>创建监听器类

      必须实现OnClickListener接口。

      class MyListener implements
      OnClickListener

      {

      @Override

      //回调方法,监听到点击事件后被回调

      public void onClick(View v)

      {

      // TODO Auto-generated method stub

      Button bt = (Button) v;

      v.setText = (“hello”);

      //在此方法中处理事件操作(点击按钮后的操作)

      }

      }

      –>实例化监听器对象。

      MyListener listener = new MyListener();

      –>为事件源对象绑定监听器对象。

      bt.setOnClickListener(listener);

      //可以把多个事件源绑定到同一个监听器对象上。

      //setOnClickListener该方法属于所有控件的父类:view,所以所有空间都可以绑定监听器

      this:方法内部的this,哪个对象调用该方法,this就代表谁。

       

    • 弹出框:

      Toast.makeText(this, “hello”, Toast.LENGTH_LONG).show();

       

    • Contex:场景

      Button btn = new Button(Ctx);//CtxContex的一个直接或间接子类的对象

    • 安卓MVC模式:

      M:模型层—业务层

      V:视图层—xml布局文件

      C:控制层—Activity

    • 另外一种事件触发机制:

      —>在布局文件中设置OnClick属性


      <Button

      android:id=”@+id/Button”

      android:layout_width=”wrap_content”

      android:layout_height=”wrap_content”

      android:text=”@string/hello_world”

      android:onClick=”ButtonPress1/>

      —>在MainActivity.java中编写事件监听方法

      public ButtonPress1(View v)

      {

      System.out.println(“ButtonPress1″);

      }

    • 所有的Activity都必须放在同一包中。所有的Activity都需要配置。

       

    • 常用控件:

      Button按钮:

      TextView文本显示:

      EditText编辑框:

      CheckButton单选框:

      RadioButton多选框:

      Menu菜单:

      AlertDialog对话框:

      方式一:

      //在布局文件中添加监听方法

      <Button

      android:id=”@+id/Button”

      android:layout_width=”wrap_content”

      android:layout_height=”wrap_content”

      android:text=”@string/hello_world”

      android:onClick=”ButtonPress1″/>

      //编写监听函数

      public void ButtonPress1(View v)

      {

      AlertDialog.Builder builder = new AlertDialog.Builder(this);//新建

      builder.setTitle(“错误!”);//标题

      builder.setMessage(“输入内容有误\n请重新输入”);//内容

      builder.setIcon(R.drawable.ic_launcher);//图标

      builder.show();//显示

      }

      //运行结果如下图:


      方式二:用布局文件控制对话框的显示方式

      —>dialog2.xml//新建对话框布局文件

      <?xml version=”1.0″ encoding=”utf-8″?>

      <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android&#8221;

      android:layout_width=”match_parent”

      android:layout_height=”match_parent”

      android:orientation=”vertical” >

     

    <TextView

    android:id=”@+id/Dialog2″

    android:layout_width=”wrap_content”

    android:layout_height=”wrap_content”

    android:text=”对话框2″ />

    <Button

    android:id=”@+id/Sure”

    android:layout_width=”wrap_content”

    android:layout_height=”wrap_content”

    android:text=”确定” />

    <Button

    android:id=”@+id/Exit”

    android:layout_width=”wrap_content”

    android:layout_height=”wrap_content”

    android:text=”退出” />

    </LinearLayout>

    —>MainActivity.java//编写对话框触发事件

    public void ButtonPress2(View v)

    {

    AlertDialog.Builder builder = new AlertDialog.Builder(this);


    View view = this.getLayoutInflater().inflate(R.layout.dialog2, null);


    builder.setView(view);


    final AlertDialog dialog = builder.create();

    Button sure = (Button) view.findViewById(R.id.Sure);

    sure.setOnClickListener(new OnClickListener() {

    public void onClick(View v)//内部类

    {

    Toast.makeText(MainActivity.this, “你好”, 1).show();

    }

    });

    Button exit = (Button) view.findViewById(R.id.Exit);

    exit.setOnClickListener(new OnClickListener() {

    public void onClick(View v)

    {

    dialog.cancel();

    }

    });

    builder.show();

    }

    //运行结果如下图:


    方式三:新的Activity(启动新界面)

    —>新建Activity和布局文件

    //TwoActivity.java

    public class TwoActivity extends Activity

    {

    @Override

    protected void onCreate(Bundle savedInstanceState)

    {

    // 调用父类中被重写的函数,做初始化工作

    super.onCreate(savedInstanceState);

    // 根据twoactivity.xml文件做出界面

    this.setContentView(R.layout.twoactivity);

    }

    }

    //twoactivity.xml

    <?xml version=”1.0″ encoding=”utf-8″?>

    <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android&#8221;

    android:layout_width=”match_parent”

    android:layout_height=”match_parent”

    android:orientation=”vertical” >

    <Button

    android:id=”@+id/Dialog3″

    android:layout_width=”wrap_content”

    android:layout_height=”wrap_content”

    android:text=”对话框3″ />

    </LinearLayout>

    —>把新Acitvity加入到Manifest.xml文件中

    <activity


    android:theme=”@android:style/Theme.Dialog”

    android:name=”.TwoActivity”

    android:label=”对话框3″>

    </activity>

    —>在MainActivity中启动对话框

    public void ButtonPress3(View v)

    {

            Intent intent = new Intent();

            intent.setClass(this, TwoActivity.class);

            this.startActivity(intent);

    }

    //运行结果如下图:


    • 跳转到新的Activity:

      public void ButtonPress3(View v)

      {

      Intent intent = new Intent();//意图对象

      Class c = TwoActivity.class;//获取TwoActivity类的代码信息

      intent.setClass(this, TwoActivity.class);//把TwoActivity的代码信息放入到意图对象intent中,后台通过反射根据intent中的代码信息创建TwoActivity类的对象

      this.startActivity(intent);//跳转到新的Activity(TwoActivity),原来的Activity被压栈。点击返回键会销毁当前的Activity,切换到被压栈的Activity。

      }

    • 带数据跳转:

      //在父Activity中存放数据(键值对)

      public void ButtonPress3(View v)

      {

      Intent intent = new Intent();//意图对象

      Class c = TwoActivity.class;//获取TwoActivity类的代码信息

      intent.setClass(this, TwoActivity.class);//把TwoActivity的代码信息放入到意图对象intent中,后台通过反射根据intent中的代码信息创建TwoActivity类的对象

      Bundle b = new Bundle();//Bundle中存放键值对

      b.putString(“name”, “xiaoming”);

      b.putInt(“age”, 20);

      intent.putExtras(b);

      this.startActivity(intent);//跳转到新的Activity(TwoActivity),原来的Activity被压栈。(点击返回键会销毁当前的Activity,切换到被压栈的Activity。)

      }

      //在子Activity中通过键值对取出数据

      public class TwoActivity extends Activity

      {

      @Override

      protected void onCreate(Bundle savedInstanceState)

      {

      // 调用父类中被重写的函数,做初始化工作

      super.onCreate(savedInstanceState);

      // 根据twoactivity.xml文件做出界面

      this.setContentView(R.layout.twoactivity);

      Intent intent = this.getIntent();

      Bundle bundle = intent.getExteras();

      String name = bundle.getString(“name”);//通过键值对取出数据

      int age = bundle.getInt(“age”);

      System.out.println(“name:” + name + “age:” + age);

      }

      }

  • 消息提示框Toast:

    设置显示内容和显示时间(值为0或1)


    显示消息提示框


    设置显示位置


    根据布局文件设置消息框外观


    使用之前必须线通过inflate方法找到该布局文件。

    View view = this.getLayoutInflater().inflate(R.layout.toast, null);

    //这是一个复合语句,从右到左执行,先调用this的getLayoutInflater()方法,其返回值为一个LayoutInflater 类型的对象,然后调用LayoutInflater 类型对象的inflate方法。

    Toast toast = new Toast(this);

    toast.setView(view);

    toast.show();

     

  • ListView:

    一般方法:

    —>创建ListView对象

    —>创建适配器对象

    —>启动ListView

    ListView listView = (ListView) this.findViewById(R.id.listView);

    String names[] = new String[]{“aa”,”bb”,”cc”,”dd”};

    //创建是配置对象(泛型)。ListView的外观由name布局文件控制,ListView的内容存在names数组中

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.name, names); listView.setAdapter(adapter);//设置适配器

    listView.setOnItemClickListener(this);//为ListView创建监听器

    @Override

    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3)

    {

    //arg0:当前点击的ListView对象

    //arg1:ListView对象中被点击到的某一个项目

    //arg2:该项目在整个ListView中的序号(从0开始)

    //arg3:与arg2类似,只不过能表示的范围更大

    TextView tv=(TextView) arg1;

    String name = tv.getText().toString();

    Toast.makeText(this, name+”,arg2->”+arg2+”,arg3->”+arg3, Toast.LENGTH_LONG).show();

    }

    自定义适配器外观:

    —>MainActivity.java

    ListView listView = (ListView) this.findViewById(R.id.listView);//设置ListView的布局文件

    MyAdapter adapter = new MyAdapter(this);//新建适配器对象

    listView.setAdapter(adapter);//设置适配器

    listView.setOnItemClickListener(this);

    —>MyAdapter.java

    //自定义适配器类中重写的方法由系统自动调用,无需人工干预

    public class MyAdapter extends BaseAdapter

    {

    private List<String> list = new ArrayList<String>();//创建存放数据的容器

    private Activity activity;

    //可以把ListView中要显示的每一项数据通过构造函数传递过来

    public MyAdapter(Activity activity)

    {

    this.activity = activity;

    for (int i = 0; i < 20; i++)

    {

    list.add(“aa”+i);

    }

    }

    @Override

    public int getCount()//ListView中包含的项目数

    {

    return list.size();

    }

    @Override

    public View getView(int position, View convertView, ViewGroup parent)//系统启动ListView后自动调用,根据getCount的返回值绘制每一项,position指的的当前项目的序号

    {

    //找到ListView的布局文件

    View view = this.activity.getLayoutInflater().inflate(R.layout.stu,null);

    //找到ListView布局文件中的TextView

    TextView tv = (TextView) view.findViewById(R.id.textView);

    tv.setText(list.get(position));//设置当前项目中显示的内容

    return view;

    }

    @Override

    public Object getItem(int position)

    {

    return null;

    }

    @Override

    public long getItemId(int position)

    {

    return 0;

    }

    }

    —>stu.xml

    <?xml version=”1.0″ encoding=”utf-8″?>

    <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android&#8221;

    android:orientation=”horizontal” android:layout_width=”fill_parent”

    android:layout_height=”fill_parent”>

    <ImageView

    android:src=”@drawable/icon”

    android:layout_width=”wrap_content”

    android:layout_height=”wrap_content”></ImageView>

    <TextView android:text=”ssss” android:id=”@+id/textView”

    android:layout_width=”wrap_content” android:layout_height=”wrap_content”></TextView>

    </LinearLayout>

    //运行结果如下图:


    • Handler消息传递机制:


      UI操作只能在主线程中完成。

      数据传到哪个线程,就在哪个线程中创建Handler对象。

      消息对象在需要传递数据给其他线程的线程中创建。

  • 进度条:

    在主UI线程中创建子线程,用于处理耗时操作。然后子线程通过Handler机制把处理进度发送给主线程用于显示进度。

  • 数据存储:
    • 文件流:
    • SharePreference:
    • SQLite3:
      • 基本操作语句

        cmd

        adb shell

        cd /sdcard

        sqlite3 xxx

        //创建表

        create table stu(id integer primary key autoincrement, name char(10), age integer);

        //增

        insert into stu(name, age)values(‘小明’, 20);

        //删

        delete from stu; //清空表

        delete from stu where id=1;

        delete from stu where name=’ss3′ or id=23;

        delete from stu where name=’ss3′ and id=23;

        //修改

        update stu set name=’xiaoWang’, age=100 where _id>11 and _id<14;

        //查询

        select * from stu;

        select _id, name, age from stu where id>13;

         

      • 相关类SQliteOpenHeader

     

  • 传感器:

     

  • Activity的生命周期:

    回调函数调用时间:

    OnCreate:界面创建时调用。

    OnStart:界面显示时调用。

    OnRestart:

    OnResume:界面可交互时调用。

    OnPause:界面失去交互时调用。

    OnStop:界面显示时调用。

    OnDestory:界面销毁时调用。

  • 网络:

     

  • 媒体:

     

  • 安卓四大组件:
    • Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器
    • 四大组建都需要在Mainfest中配置。

       

  • 服务:
    • 步骤:
      • 新建服务类,继承Service父类,重写父类的相关方法。

        public class MyService extends Service

        {

        @Override

        public IBinder onBind(Intent intent)

        {

        return null;

        }

        @Override

        public void onCreate()

        {

        }

        @Override

        public void onStart(Intent intent, int startId)

        {

        }

        @Override

        public void onDestory()

        {

        }

        }

      • 配置Mainfest:

        <service android:name=”com.fs.service.MyService” >

        <intent-filter >

        <action android:name=”aa.bb.cc” />

        </intent-filter >

        </service>

        Intent intent = new Intent();

        intent.setAction(“aa.bb.cc”);

      • 开服务:

        this.StartService(intent);

        • 1,如果服务对象不存在(一般在第一次开服务的时候):

          a,创建服务对象。

          b,回调onCreate()方法。

          c,回调onStart()方法。

        • 2,如果服务对象存在(不再创建服务对象):

          a,回调onStart()方法。

      • 关服务:

        this.stopService(intent);

        • 1,如果服务对象不存在:
          • a,不做任何事,但是不报错。
        • 2,如果服务对象存在:
          • a,回调onDestory()方法。
          • b,销毁服务对象。

             

    • 一般在服务中开子线程,做长时间操作。

      在服务中开子线程与直接开子线程都能实现相同的操作,但是意义不一样。

      服务是一个应用程序的组件,可以在后台长时间运行,并且不提供用户接口(界面)

      区别:

      • 通过服务开子线程,当所有Activity都被销毁后,子线程并没有结束(所有Activity都被关闭的进程称为空进程),仍在后台运行。而直接开子线程,当所有Activity都被销毁后子线程很容易被后台销毁。
      • 可以跨项目开服务。

转载请注明:胡椒小兄弟 » 安卓入门学习笔记

喜欢 (3)or分享 (0)