• 【S1】1.基本知识 & intent初步


    2015-05-02

    ----曾经看过的现在忘记的也差不多了,于是才终于发现,只有认真做笔记才能更好的掌握。

    如果不是因为迫于生计,没有人会去用java。——许多程序员

    (吐槽结束)

    站在应用层进行开发,且在没有时间,大作业deadline就要到了的情况下,熟悉API,有一个好的API查阅习惯是最需要的。而且熟悉API是学习语言最为根本,不会因语言过时而丢失的好处。

    所用IDE为Android studio。

    Android studio下载各版本API稍有难度,我现在电脑上仅有version21,该问题我必须尽快解决。

    1. 项目目录结构

    新建一个空项目,自己建一遍项目目录,个人感觉是一种不错的学习方法。

    需要重视的有

    • manifests
      • 项目配置文件,四大组件(activity,service,broadcast,content provider)需要在这里注册,并给予适当权限,还能制定兼容版本和目标版本。
    • java 
      • 放置java代码的地方
    • res->layout
      • 放置布局的XML文件
    • res其他内容
      • 放置图片的drawable,若只有一张图片可选定drawable-hdpi
      • menu放置菜单配置XML文件
      • value 中string放置XML中的string文件,个人认为作用相当于宏定义,有利于文件修改

    Android studio隐藏了不少无关内容,但我们需要知道,任何一个资源都赋给了一个唯一的资源ID放在一个文件中。生成的apk调试程序也在一个被项目表隐藏的文件夹中存放。第三方Jar包在Android studio中需要自行创建目录文件。

    2. LogCat

    相当于cout,system.out.println,print,printf等输出语句,用于调试。

    Log.e()是Android程序开发专用的一种简单且最有用的调试手段。且勿利用system.out调试。

    以Log.e()为例,其接受两个参数,第一个为tag,用于filter过滤,第二个是打印的信息,用于判断错误原因。

    3. 基本流程

    1.) 在java目录下新建一个(java).class文件,继承Activity,重写onCreate()方法。

    重写时首先super调用父类方法用默认实现进行初始化。

    2.) 在layout目录下新建(layout).xml文件,初期学习选择LinearLayout。布局的基本参数有

    orientation,layout_width,layout_height,默认的scheme。

    总体布局结束后添加其他组件,不建议利用图形的界面进行编辑,不利于理解,也不利于在java类文件中对布局进行操作。

    值得注意的有两点

      尽量将xml布局文件中的字符串保存在res->string中去。有利于后期修改。

      注意将每一个控件添加名字,便于在java类文件中引用。

    3.) 在AndroidManifest注册。在application下添加activity,利用intent-filter将其设置为主activity。activity的参数有name和label。name是java类文件名称,label是显示的app名称。安装包名称才是建项目时确定的名称。

    4. 更进一步

    可以延伸的部分

    1. Toast提示

    Toast.makeText(FirstActivity.this, "first", Toast.LENGTH_LONG).show();

    其中的FirstActivity.this即为context,即toast发生的环境。

    2. 隐藏标题栏

    1 protected void onCreate(Bundle saveInstanceState) {
    2     super.onCreate(saveInstanceState);
    3     requestWindowFeature(Window.FEATURE_NO_TITLE);
    4     setContentView(R.layout.first);
    5 }

    第三行即为隐藏标题栏代码。

    3. 添加Menu

    1.) res下新建menu文件夹,在menu下新建XML文件。对其进行配置。

    1 <?xml version="1.0" encoding="utf-8"?>
    2 <menu xmlns:android="http://schemas.android.com/apk/res/android">
    3     <item
    4         android:id="@+id/item1"
    5         android:title="@string/menu1"/>
    6     <item
    7         android:id="@+id/item2"
    8         android:title="@string/menu2"/>
    9 </menu>

    menu利用的是默认主题,有两个item,title和id分别定义显示名字和操作的名字。对应的每一个ID都会生成一个唯一的资源操作符。在java类文件中可以用findViewById()方法找到。并向下转型进行操作。

    2.) 在需要加入菜单的activity的java类文件中重写onCreateOptionsMenu()方法

    1 public boolean onCreateOptionsMenu(Menu menu) {
    2     getMenuInflater().inflate(R.menu.main, menu);
    3     return true;
    4 }

    通过getMenuInflater()方法能够得到MenuInflater对象。用inflate()方法可以给当前活动创建菜单。

    inflate()方法接收两个参数,第一个参数用于指定我们通过哪一个资源文件来创建菜单。第二个参数用于指定我们的菜单项将添加到哪一个Menu对象当中。然后给这个方法返回true,表示允许创建的菜单显示出来,如果返回了false,创建的菜单将无法显示。

    3.)  对选定菜单项进行操作,重写onOptionsItemSelected()方法。

     1     @Override
     2     public boolean onMenuItemSelected(int featureId, MenuItem item) {
     3         switch (item.getItemId()){
     4             case R.id.add_item:
     5 
     6             case R.id.remove_item:
     7 
     8             default:
     9 
    10         }
    11         return true;
    12     }

    传入的item即为菜单项的view,利用switch将view的id与R.java中资源的ID进行对比来判断对谁进行操作。

    4. 销毁活动

    利用finish();即可销毁一个活动。

    5. 建设多个activity

    仅需写多个java类文件,每个类文件对应一个单独的layout文件,注意其中的变量名称,不能有重复。分别写完后在AndroidManifest.xml中进行配置,只需要

    1         <activity android:name=".SecondActivity">
    2         </activity>

    即可完成一个非主activity的基本配置。

    5. Intent实现的activity切换与通信。

    Intent一般可被用于启动活动、启动服务、以及发送广播等场景。同时,其也可以进行一些数据的传递。

    显式intent:

    intent的构造函数有多个。先说一个与activity切换关系很大的:

    Intent(Context packageContext, Class<?> cls);

    第一个与前面toast的首个参数含义相同,指目前的环境。即当前的java.this。第二个是启动的类文件名。

    1     button1.setOnClickListener(new View.OnClickListener() {
    2         @Override
    3         public void onClick(View v) {
    4             Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
    5             startActivity(intent);
    6         }
    7     });

    用startActivity判断打开新的activity。
    用起来十分简单。

    隐式intent:

    隐式的intent是利用匹配intent传入的信息与AndroidManifest内的信息来确定显示的activity的。

    1         button1.setOnClickListener(new View.OnClickListener() {
    2             @Override
    3             public void onClick(View v) {
    4                 Intent intent = new Intent("MY_OWN");
    5                 startActivity(intent);
    6             }
    7         });

    当一个activity的intent-filter内的action与category,和java文件中intent传入的信息相同时,activity就会打开。

    上面的代码中传入的是“MYOWN”,对应的配置情况为

    1         <activity android:name=".SecondActivity">
    2             <intent-filter>
    3                 <action android:name="MY_OWN"/>
    4                 <category android:name="android.intent.category.DEFAULT"/>
    5             </intent-filter>
    6         </activity>

    default对应的是默认情况。

    也可以通过addCategory()方法来改变添加分类。例如:

    1 Intent intent = new Intent("MY_OWN");
    2 intent.addCategory("MY_CATEGORY");

    此时若直接调试,会报错。因为没有任何一个完全符合要求的activity。除非更改配置的category信息:

    1         <activity android:name=".SecondActivity">
    2             <intent-filter>
    3                 <action android:name="MY_OWN"/>
    4                 <category android:name="MY_CATEGORY"/>
    5             </intent-filter>
    6         </activity

    还有很多隐式的用法。

    1 public void onClick(View v) {
    2     Intent intent = new Intent(Intent.ACTION_VIEW);
    3     intent.setData(Uri.parse("http://www.cnblogs.com/xtlu/"));
    4     startActivity(intent);
    5 }

    其中Intent.ACTION_VIEW是一个常信息,匹配后利用setData中的内容请求其他应用的操作。

    setData的用法就是另外的故事了。Data属性可以在接受该隐式intent的activity的intent内进行配置。常见的参数有scheme,host,port,path,mimeType。用IDE打出首字母即可查找并查阅文档。

    类似的还有很多,上面的可以打开网页,利用Intent.ACTION_DIAL还可以打开拨打电话页面。不再赘述。

    数据传递intent:

    我只是随便起的名字。)

    数据可以传递过去,也可以传递回来。

    从当前activity传递数据,利用

    1 intent.putExtra("data", data);

    其中"data"是key,data才是数据。若data为string类型,则接受data的activity内可以这样写:

    1 protected void onCreate(Bundle savedInstanceState) {
    2     super.onCreate(savedInstanceState);
    3     setContentView(R.layout.second_layout);
    4     Intent intent = getIntent();
    5     String data = intent.getStringExtra("data");
    6 }

    写在onCreate()方法内,直接调用。用getIntent()方法取出上次传入的intent,getStringExtra()用于取string类型的data。所需参数为key。

    传回数据所用的start方法不同。利用startActivityForResult()启动新的activity。

    1 public void onClick(View v) {
    2     Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
    3     startActivityForResult(intent, 1);
    4 }

    第二个参数为请求码,先不要着急它的意思。

    在第二个activity中发送数据的过程:

    1 button2.setOnClickListener(new OnClickListener() {
    2     @Override
    3     public void onClick(View v) {
    4         Intent intent = new Intent();
    5         intent.putExtra("data_return", "Hello FirstActivity");
    6         setResult(RESULT_OK, intent);
    7         finish();
    8     }
    9 });

    创建空的intent仅用来发送数据。setResult第一个参数返回处理结果,第二个即为intent事件。

    不要着急第一个返回的处理结果的意思。

    请求码和处理结果都在接受信息的时候有用。

     1 @Override
     2 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     3     switch (requestCode) {
     4     case 1:
     5       if (resultCode == RESULT_OK) {
     6           String returnedData = data.getStringExtra("data_return");
     7        }
     8       break;
     9     default:
    10     }
    11 }

    即对应的requestcode(请求码)和resultcode(处理结果)都有一一对应的在接受信息方的处理方式。

    返回值得过程也可以放在onBackPressed()中,这样不需要手动finish(),按back键也可返回。

  • 相关阅读:
    [置顶] location.href你真的会用了?
    Hive HA使用说明
    十进制转换为任意进制及操作符重载
    《重构》学习总结
    linux kill进程和子进程小trick
    express for node 路由route几种实现方式的思考
    BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第2章节--SharePoint 2013 App 模型概览 总结
    Can rename table but can not truncate table
    HBase
    链表解说和基本操作练习附代码
  • 原文地址:https://www.cnblogs.com/xtlu/p/4472276.html
Copyright © 2020-2023  润新知