文档章节

我的Android开发学习笔记(一)手电筒

斯基劳绅士
 斯基劳绅士
发布于 2014/09/28 14:01
字数 2220
阅读 172
收藏 1

为什么会想到做手电筒呢?第一是因为我的骚尼手机有闪光灯却没有自带的手电筒程序,而兰大素有晚上十一点停电的恶规,没有手电筒实在不便。那为什么不去下载一个手电筒应用呢?卧槽,问题真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);

理论结束,开始做我们的欢迎界面,首先,我在网上随便找了张哔哩哔哩娘的图: B娘,就你啦

将图片放入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有四种本质区别的状态:

  1. 在屏幕的前台(Activity栈顶),叫做活动状态或者运行状态(active or running)
  2. 如果一个Activity失去焦点,但是依然可见(一个新的非全屏的Activity 或者一个透明的Activity 被放置在栈顶),叫做暂停状态(Paused)。一个暂停状态的Activity依然保持活力(保持所有的状态,成员信息,和窗口管理器保持连接),但是在系统内存极端低下的时候将被杀掉。
  3. 如果一个Activity被另外的Activity完全覆盖掉,叫做停止状态(Stopped)。它依然保持所有状态和成员信息,但是它不再可见,所以它的窗口被隐藏,当系统内存需要被用在其他地方的时候,Stopped的Activity将被杀掉。
  4. 如果一个Activity是Paused或者Stopped状态,系统可以将该Activity从内存中删除,Android系统采用两种方式进行删除,要么要求该Activity结束,要么直接杀掉它的进程。当该Activity再次显示给用户时,它必须重新开始和重置前面的状态。

Activity有三个关键的循环: 

  1. 整个的生命周期,从onCreate(Bundle)开始到onDestroy()结束。Activity在onCreate()设置所有的“全局”状态,在onDestory()释放所有的资源。例如:某个Activity有一个在后台运行的线程,用于从网络下载数据,则该Activity可以在onCreate()中创建线程,在onDestory()中停止线程。

  2. 可见的生命周期,从onStart()开始到onStop()结束。在这段时间,可以看到Activity在屏幕上,尽管有可能不在前台,不能和用户交互。在这两个接口之间,需要保持显示给用户的UI数据和资源等,例如:可以在onStart中注册一个IntentReceiver来监听数据变化导致UI的变动,当不再需要显示时候,可以在onStop()中注销它。onStart(),onStop()都可以被多次调用,因为Activity随时可以在可见和隐藏之间转换。

  3. 前台的生命周期,从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点熄灯后看不见了

在此输入图片描述

© 著作权归作者所有

共有 人打赏支持
斯基劳绅士
粉丝 9
博文 11
码字总数 13905
作品 0
兰州
程序员
私信 提问
[Android] 如何制作手电筒程序

继iphone的手电筒开发完成后,接下来我便著手开始Android如何制作手电筒的程序 我的跨平台引擎框架CloudBox已建立好iphone版的程序,但却对于Android上如何操控闪光灯一无所知 因此我做了个小...

长平狐
2012/10/08
636
0
第一天学习Android的一些笔记

昨天学习了怎样装Android配置环境,下载SDK用了好久的时间,再加上一开始不会,弄了好长时间,今天第一天学习,跟着视频教程学的。下边是我的一些笔记,仅做留念与学习笔记 。 快捷键: 智能...

子弹兄
2014/01/16
0
0
Android adt bundle 开发环境配置及第一个“Hello world”程序运行

最近在学习Android 顺便记录下学习过程当作复习吧,这是写的第一篇正式博客。 一、jdk环境配置 二、android adt bundle 下载 三、安装SDK 四、模拟器及真机调试 五、第一个程序 Hello world!...

程序猿付显
2014/07/23
0
0
CloudBox范例代码:CloudLED

这个代码是一个跨平台的手电筒程序 CloudLED是透过跨平抬筐架CloudBox开发的 如何在iPhone控制LED 如何在Android控制LED 这个范例示范了如何将实践抽离,面对抽象的方式 到我的资源可下载源码...

长平狐
2012/10/08
109
0
求 android 手电筒 程序源码一份,谢谢

求 android 手电筒 程序源码一份,谢谢 我的手机型号:nexus S (三星i9023),系统版本4.1,开发工具eclipse 在网上下载的代码,安装到手机,没有打开闪光灯, 程序代码是:调用camer的参数...

我的CSharp时代
2013/04/10
204
0

没有更多内容

加载失败,请刷新页面

加载更多

JavaScript继承(二)——借用构造函数

JavaScript继承(一)——原型链中提出原型链继承的两个问题:一是原型的数据共享问题,二是创建子类型的实例时,不能向父类型的构造函数中传递参数。这两个问题的根源还是在于使用原型模式创...

Bob2100
9分钟前
0
0
day25:比较两个文件内容|杀进程|并发备份数据库|并发进程备份mysql库|监控全国CDN网站节点|

1、有两个文件 a.txt 和 b.txt,把 a.txt 中有的但 b.txt 中没有的行找出来,并写入列 c.txt,然后计算 c 的行数; 注释:比较两个文件两个文件不同,可以用的方法:diff md5sum grep -vf $1 $...

芬野de博客
25分钟前
0
0
抓包工具Charles

背景介绍 Charles是一款很实用,界面很友好(至少跟fiddler比起来),功能强大的抓包神器,因为它是基于 java 开发的,所以跨平台,Mac、Linux、Windows下都是可以使用的,并且在Android和i...

Jack088
26分钟前
0
0
徒手撸一个简单的RPC框架

徒手撸一个简单的RPC框架 之前在牛逼哄哄的 RPC 框架,底层到底什么原理得知了RPC(远程过程调用)简单来说就是调用远程的服务就像调用本地方法一样,其中用到的知识有序列化和反序列化、动态...

不学无数的程序员
46分钟前
1
0
Java 面试题目最全集合1000+ 大放送,能答对70%就去BATJTMD试试~

2019,相对往年我们会发现今年猎头电话少了,大部分企业年终奖缩水,加薪幅度也不如往年,选择好offer就要趁早,现在开始准备吧,刷一波Java面试题,能回答70%就去BATJTMD大胆试试~ 以下是2...

mikechen优知
51分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部