【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键也可返回。

原文地址:https://www.cnblogs.com/xtlu/p/4472276.html