我的Android开发学习笔记(一)手电筒
2014-09-28 00:00
316 查看
摘要: 学习Android应用开发已经半个月了,虽然照着oschina上的博文做过一个计算器,但终究不是自己的东西,在基本构建好Android世界观之后,开始尝试做一个Android平台的手电筒,有很多自己的心得,嫌啰嗦的童鞋自行右上角吧o(╯□╰)o
为什么会想到做手电筒呢?第一是因为我的骚尼手机有闪光灯却没有自带的手电筒程序,而兰大素有晚上十一点停电的恶规,没有手电筒实在不便。那为什么不去下载一个手电筒应用呢?卧槽,问题真TM多,直接开干!
(一)尝试多Activity
按理来说手电筒是一个单Activity(单屏嘛,能做几个Activity),但是由于上一个程序(计算器)也是单一Activity的,所以我现在或许应该写一个简单的多Activity应用入门,没办法,只能强行多Activity了,通过制作一个欢迎界面(类似于某宝,某信),2.5秒后跳转到主Activity,从而达到多Activity的练习
要实现多Activity,需要理解意图类Intent,我个人将之理解为Android系统的意图——沟通各个活动的桥梁,那么切换Activity一共有五种方式可供选择:
Intent intent = new Intent();
(1)intent.setClass(this,OtherActivity.class);
(2)intent.setClassName(this,"com.xiazdong.OtherActivity");
(3)intent.setClassName("com.xiazdong","com.xiazdong.OtherActivity");
//此种方式用来激活不同应用的Activity,只需要指定第一个参数:包名为另一个应用即可;
(4)Component comp = new Component(this,OtherActivity.class);
intent.setComponent(comp);
(5)Intent intent = new Intent(this,OtherActivity.class);
理论结束,开始做我们的欢迎界面,首先,我在网上随便找了张哔哩哔哩娘的图:
将图片放入res\drawable-hdpi中
下面创建欢迎界面的Activity,Java代码如下:
在AndroidManifest.xml文件中将这个activity设置成启动入口,代码如下:
把欢迎界面的XML文件写好:
这样就可以实现跳转了,在欢迎界面的滞留时间为2.5秒
效果图:
分析:
我们先来看看 Handler().postDelayed(new Runnable(){run函数},毫秒数)意思地延迟多少毫秒将Runnable插入到消息队列中,Runnable将在handle绑定的线程中运行。下面的run()很容易理解,这里采用的是第五种intent跳转方法
Activity_splash.xml中调用背景图 android:background="@drawable/splash" 这里解释一下@的作用,我们会发现在Android的中引用png资源方法很简单,甚至不需要加路径和后缀,其实,@已经给出了路径
好的,多Activity分析到此,其实手电筒启动要求快速,原则上是不应该设置欢迎界面的,但是为了练习intent类和欢迎界面的制作,就只能强行这样了o(╯□╰)o
(二)手电筒UI设计
废话不多说,上代码
Activity_main.xml的代码
这里为了友好的UI,我对ToggleButton控件自定义了一部分,自定义的代码togglebutton.xml存放在drawable/目录下
图像资源也放在drawable\目录下,实现效果如下
点击之后:
至此,UI已经基本搞定,由于PS水平很有限,作这两个状态的简单UI确实磨了很久,Android的UI设计时,建议去看看Google的一些设计理念
(三)手电筒核心代码
Java代码:
在Manifest中插入的代码(很重要,涉及权限)
注意应将它们插入到<application>标签以外
分析:
JAVA代码:区别于第一次的计算器,这一次的监听采用了另一种方法,即
控件.setOnClickListener(new OnClickListener(){onClick函数});
对相机闪关灯的调用主要是在onclick方法中,一定注意在退出程序是将camera释放——camera.release(),否则相机将不可用
重点来了,在哪里加入此段代码,这里,我们来了解一下Android的Activity的生命周期(摘自某网友):
在系统中的Activity被一个Activity栈所管理。当一个新的Activity启动时,将被放置到栈顶,成为运行中的Activity,一个Activity保留在栈中,不再放到前台,直到新的Activity退出为止。Activity有四种本质区别的状态:
在屏幕的前台(Activity栈顶),叫做活动状态或者运行状态(active or running)
如果一个Activity失去焦点,但是依然可见(一个新的非全屏的Activity 或者一个透明的Activity 被放置在栈顶),叫做暂停状态(Paused)。一个暂停状态的Activity依然保持活力(保持所有的状态,成员信息,和窗口管理器保持连接),但是在系统内存极端低下的时候将被杀掉。
如果一个Activity被另外的Activity完全覆盖掉,叫做停止状态(Stopped)。它依然保持所有状态和成员信息,但是它不再可见,所以它的窗口被隐藏,当系统内存需要被用在其他地方的时候,Stopped的Activity将被杀掉。
如果一个Activity是Paused或者Stopped状态,系统可以将该Activity从内存中删除,Android系统采用两种方式进行删除,要么要求该Activity结束,要么直接杀掉它的进程。当该Activity再次显示给用户时,它必须重新开始和重置前面的状态。
Activity有三个关键的循环:
整个的生命周期,从onCreate(Bundle)开始到onDestroy()结束。Activity在onCreate()设置所有的“全局”状态,在onDestory()释放所有的资源。例如:某个Activity有一个在后台运行的线程,用于从网络下载数据,则该Activity可以在onCreate()中创建线程,在onDestory()中停止线程。
可见的生命周期,从onStart()开始到onStop()结束。在这段时间,可以看到Activity在屏幕上,尽管有可能不在前台,不能和用户交互。在这两个接口之间,需要保持显示给用户的UI数据和资源等,例如:可以在onStart中注册一个IntentReceiver来监听数据变化导致UI的变动,当不再需要显示时候,可以在onStop()中注销它。onStart(),onStop()都可以被多次调用,因为Activity随时可以在可见和隐藏之间转换。
前台的生命周期,从onResume()开始到onPause()结束。在这段时间里,该Activity处于所有 Activity的最前面,和用户进行交互。Activity可以经常性地在resumed和paused状态之间切换,例如:当设备准备休眠时,当一个 Activity处理结果被分发时,当一个新的Intent被分发时。所以在这些接口方法中的代码应该属于非常轻量级的。
Activity的整个生命周期都定义在下面的接口方法中,所有方法都可以被重载。所有的Activity都需要实现 onCreate(Bundle)去初始化设置,大部分Activity需要实现onPause()去提交更改过的数据,当前大部分的Activity也需要实现onFreeze()接口,以便恢复在onCreate(Bundle)里面设置的状态。
public class Activity extends ApplicationContext {
protected void onCreate(Bundle icicle);
protected void onStart();
protected void onRestart();
protected void onResume();
protected void onFreeze(Bundle outIcicle);
protected void onPause();
protected void onStop();
protected void onDestroy();
}
了解生命周期后我们发现,在重写onPause()并在其中释放camera较合理
。。。。。。。。。。。。。。
最后,我们把图标和APP的名字变更一下,变更图标只需替换icon.png文件,修改App名称只需将String.xml中的app_name改为你想要的名称即可,一个手电筒就完成了!妈妈在也不用担心我在11点熄灯后看不见了
为什么会想到做手电筒呢?第一是因为我的骚尼手机有闪光灯却没有自带的手电筒程序,而兰大素有晚上十一点停电的恶规,没有手电筒实在不便。那为什么不去下载一个手电筒应用呢?卧槽,问题真TM多,直接开干!
(一)尝试多Activity
按理来说手电筒是一个单Activity(单屏嘛,能做几个Activity),但是由于上一个程序(计算器)也是单一Activity的,所以我现在或许应该写一个简单的多Activity应用入门,没办法,只能强行多Activity了,通过制作一个欢迎界面(类似于某宝,某信),2.5秒后跳转到主Activity,从而达到多Activity的练习
要实现多Activity,需要理解意图类Intent,我个人将之理解为Android系统的意图——沟通各个活动的桥梁,那么切换Activity一共有五种方式可供选择:
Intent intent = new Intent();
(1)intent.setClass(this,OtherActivity.class);
(2)intent.setClassName(this,"com.xiazdong.OtherActivity");
(3)intent.setClassName("com.xiazdong","com.xiazdong.OtherActivity");
//此种方式用来激活不同应用的Activity,只需要指定第一个参数:包名为另一个应用即可;
(4)Component comp = new Component(this,OtherActivity.class);
intent.setComponent(comp);
(5)Intent intent = new Intent(this,OtherActivity.class);
理论结束,开始做我们的欢迎界面,首先,我在网上随便找了张哔哩哔哩娘的图:
将图片放入res\drawable-hdpi中
下面创建欢迎界面的Activity,Java代码如下:
<!-- lang: java --> package com.example.multiactivity; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; public class SplashActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash); new Handler().postDelayed(new Runnable(){ @Override public void run() { Intent intent = new Intent(SplashActivity.this,MainActivity.class); startActivity(intent); SplashActivity.this.finish(); } }, 2500); } }
在AndroidManifest.xml文件中将这个activity设置成启动入口,代码如下:
<!-- lang: xml --> <activity android:name=".SplashActivity" android:label="@string/title_activity_splash" android:screenOrientation="portrait" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
把欢迎界面的XML文件写好:
<!-- lang: xml --> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/splash" tools:context="${relativePackage}.${activityClass}" > <TextView android:id="@+id/VersionNumber" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:layout_marginRight="22dp" android:layout_marginTop="10dp" android:text=" 手电筒\nVersion 1.0\n By Abang" /> </RelativeLayout>
这样就可以实现跳转了,在欢迎界面的滞留时间为2.5秒
效果图:
分析:
我们先来看看 Handler().postDelayed(new Runnable(){run函数},毫秒数)意思地延迟多少毫秒将Runnable插入到消息队列中,Runnable将在handle绑定的线程中运行。下面的run()很容易理解,这里采用的是第五种intent跳转方法
Activity_splash.xml中调用背景图 android:background="@drawable/splash" 这里解释一下@的作用,我们会发现在Android的中引用png资源方法很简单,甚至不需要加路径和后缀,其实,@已经给出了路径
好的,多Activity分析到此,其实手电筒启动要求快速,原则上是不应该设置欢迎界面的,但是为了练习intent类和欢迎界面的制作,就只能强行这样了o(╯□╰)o
(二)手电筒UI设计
废话不多说,上代码
Activity_main.xml的代码
<!-- lang: xml --> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="${relativePackage}.${activityClass}" > <ToggleButton android:id="@+id/toggleButton1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:checked="true" android:textOn="" android:textOff="" android:background="@drawable/togglebutton" /> </RelativeLayout>
这里为了友好的UI,我对ToggleButton控件自定义了一部分,自定义的代码togglebutton.xml存放在drawable/目录下
<!-- lang: xml --> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_checked="true" android:drawable="@drawable/button_focused" /> <!-- pressed --> <item android:drawable="@drawable/button_pressed" /> <!-- default/unchecked --> </selector>
图像资源也放在drawable\目录下,实现效果如下
点击之后:
至此,UI已经基本搞定,由于PS水平很有限,作这两个状态的简单UI确实磨了很久,Android的UI设计时,建议去看看Google的一些设计理念
(三)手电筒核心代码
Java代码:
<!-- lang: java --> package com.example.multiactivity; import android.app.Activity; import android.hardware.Camera; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.WindowManager; import android.widget.ToggleButton; public class MainActivity extends Activity { private Camera camera = Camera.open(); private ToggleButton toggleButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); toggleButton=(ToggleButton)findViewById(R.id.toggleButton1); toggleButton.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { // TODO 自动生成的方法存根 ToggleButton tb=(ToggleButton)v; Camera.Parameters param=camera.getParameters(); if(!tb.isChecked()){ param.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); } else{ param.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); } camera.setParameters(param); } }); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } @Override protected void onPause(){ camera.release(); super.onPause(); } }
在Manifest中插入的代码(很重要,涉及权限)
<!-- lang: xml --> <uses-permission android:name="android.permission.FLASHLIGHT" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" />
注意应将它们插入到<application>标签以外
分析:
JAVA代码:区别于第一次的计算器,这一次的监听采用了另一种方法,即
控件.setOnClickListener(new OnClickListener(){onClick函数});
对相机闪关灯的调用主要是在onclick方法中,一定注意在退出程序是将camera释放——camera.release(),否则相机将不可用
重点来了,在哪里加入此段代码,这里,我们来了解一下Android的Activity的生命周期(摘自某网友):
在系统中的Activity被一个Activity栈所管理。当一个新的Activity启动时,将被放置到栈顶,成为运行中的Activity,一个Activity保留在栈中,不再放到前台,直到新的Activity退出为止。Activity有四种本质区别的状态:
在屏幕的前台(Activity栈顶),叫做活动状态或者运行状态(active or running)
如果一个Activity失去焦点,但是依然可见(一个新的非全屏的Activity 或者一个透明的Activity 被放置在栈顶),叫做暂停状态(Paused)。一个暂停状态的Activity依然保持活力(保持所有的状态,成员信息,和窗口管理器保持连接),但是在系统内存极端低下的时候将被杀掉。
如果一个Activity被另外的Activity完全覆盖掉,叫做停止状态(Stopped)。它依然保持所有状态和成员信息,但是它不再可见,所以它的窗口被隐藏,当系统内存需要被用在其他地方的时候,Stopped的Activity将被杀掉。
如果一个Activity是Paused或者Stopped状态,系统可以将该Activity从内存中删除,Android系统采用两种方式进行删除,要么要求该Activity结束,要么直接杀掉它的进程。当该Activity再次显示给用户时,它必须重新开始和重置前面的状态。
Activity有三个关键的循环:
整个的生命周期,从onCreate(Bundle)开始到onDestroy()结束。Activity在onCreate()设置所有的“全局”状态,在onDestory()释放所有的资源。例如:某个Activity有一个在后台运行的线程,用于从网络下载数据,则该Activity可以在onCreate()中创建线程,在onDestory()中停止线程。
可见的生命周期,从onStart()开始到onStop()结束。在这段时间,可以看到Activity在屏幕上,尽管有可能不在前台,不能和用户交互。在这两个接口之间,需要保持显示给用户的UI数据和资源等,例如:可以在onStart中注册一个IntentReceiver来监听数据变化导致UI的变动,当不再需要显示时候,可以在onStop()中注销它。onStart(),onStop()都可以被多次调用,因为Activity随时可以在可见和隐藏之间转换。
前台的生命周期,从onResume()开始到onPause()结束。在这段时间里,该Activity处于所有 Activity的最前面,和用户进行交互。Activity可以经常性地在resumed和paused状态之间切换,例如:当设备准备休眠时,当一个 Activity处理结果被分发时,当一个新的Intent被分发时。所以在这些接口方法中的代码应该属于非常轻量级的。
Activity的整个生命周期都定义在下面的接口方法中,所有方法都可以被重载。所有的Activity都需要实现 onCreate(Bundle)去初始化设置,大部分Activity需要实现onPause()去提交更改过的数据,当前大部分的Activity也需要实现onFreeze()接口,以便恢复在onCreate(Bundle)里面设置的状态。
public class Activity extends ApplicationContext {
protected void onCreate(Bundle icicle);
protected void onStart();
protected void onRestart();
protected void onResume();
protected void onFreeze(Bundle outIcicle);
protected void onPause();
protected void onStop();
protected void onDestroy();
}
了解生命周期后我们发现,在重写onPause()并在其中释放camera较合理
。。。。。。。。。。。。。。
最后,我们把图标和APP的名字变更一下,变更图标只需替换icon.png文件,修改App名称只需将String.xml中的app_name改为你想要的名称即可,一个手电筒就完成了!妈妈在也不用担心我在11点熄灯后看不见了
相关文章推荐
- Android Map开发基础知识学习笔记
- Google.Android开发入门与实践-学习笔记2
- Android开发学习笔记
- Android开发学习笔记-2 Activity-1 基础
- Android开发学习笔记-5 Activity-4 Activity生命周期
- 【转自总监】Android开发学习笔记
- Android Map开发基础知识学习笔记(转)
- Android开发学习笔记
- Android开发入门学习笔记之三
- Android开发学习笔记-4 Activity-3 常用控件
- android应用开发学习笔记--游戏开发
- Android 学习笔记5---程序开发模式&拨号器&短信发送器小例程
- Google.Android开发入门与实践-学习笔记4
- Android开发学习笔记
- Android(OPhone) 学习笔记 - OPhone 开发环境
- Google.Android开发入门与实践-学习笔记1
- Android Map开发基础知识学习笔记
- Android 学习笔记2---开发软件的常识&搭建开发环境(windows7)
- Android开发学习笔记-3 Activity-2 Activity和Intent关系
- Android开发学习笔记-1 基础预热