说明: 大三下学期和小组成员一起写的一个安卓项目
项目比较简陋,但是这个项目把Android中四大组件的功能都实现了哦!!
先放几张图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
目 录
1 项目分析 1
1.1 项目背景 1
1.2 项目开发目的及意义 1
1.3 需求分析 2
1.3.1 功能需求分析 2
1.3.2 功能模块概述 2
1.3.3 系统流程图 3
1.4 开发及运行环境 4
2 预期目标 5
2.1 性能需求 5
2.2 记事本功能 5
2.3 构成模块 5
3 项目实施 7
3.1 关键程序步骤 7
3.1.1 Activity数据传递 7
3.1.2 数据存储 8
3.1.3 内容提供者 12
3.1.4 广播接收者 15
3.1.5 Service 17
3.2 实验结果 20
4 心得体会 25
4.1 心得体会一 25
4.2 心得体会二 25
5 附录 27
5.1 小组成员 27
5.2 成员分工 27
5.3 源程序 27
参考文献 32

1 项目分析
1.1项目背景
(略,因为和网上比较雷同所以就不放出来了,比较简单,自己百度哦)
1.2项目开发目的及意义
(略,比较简单,自己百度哦)

1.3需求分析
1.3.1功能需求分析
此次记事本开发希望能够开发一款符合用户生活工作习惯的应用,能够满足用户的各方面需求,要求功能完善丰富,具有良好的用户界面和交互体验。针对记事本软件的功能进行详细的分析,功能总体设计如图1-1所示。
使用数据库对记事进行增加,查看,修改和删除。
使用Activity数据传递实现界面跳转及数据传递(存入和取出)。
使用内部存储实现对登录信息(账号和密码的实现)的存储。使用shared Preference保存数据实现对编辑界面标题的存储
使用内容提供者提供接口实现数据库中数据共享(外部应用程序能对记事进行增删改查等操作)。
使用广播接收者实现开机自启功能。
使用Service实现开启背景音乐功能。
图1-1 记事本的功能需求分析

1.3.2功能模块概述
(1)记事本基本操作
记事本基本操作是该应用程序的核心部分,提供了添加、查看、修改、删除记事本信息的功能,提供记事本动态更新的功能。
(2)记事本主界面列表展示
用户可能需要创建很多条记事本信息,并且需要对这些记事本信息进行基本操作,例如删除、修改等功能。记事本的列表展示能使用户界面更加简洁清晰,并带给用户使用方便。
(3)记事本数据存储实现
记事本的最重要功能就是记录和保存用户容易遗忘的日期和事件,为了持久地将用户的记事本信息保存下来,需要将这些信息存储在数据库中。记事本需要保存的信息有编号(ID)、记事标题(Title )、记事内容(Content)、记事时间(Time)。
图1-2显示了记事本的功能模块信息。
图1-2 记事本功能模块图

1.3.3系统流程图
在运行记事本时,首先需要用户登录,进入记事本主页面,主页面是记事本的每个记事列表,选择新增记事,则进入编辑页面,编辑记事内容,可以添加标题和内容,记事时间则自动生成,编辑完成后,选择保存,结束记事;选择修改记事,进入编辑界面,编辑记事内容,可以修改标题和内容,记事时间则自动生成,修改完成后,选择保存,结束记事;选择查看记事,进入查看界面,显示记事时间、标题和内容;选择删除记事,则删除所选记事。图1-2展示了随心记APP主要系统操作流程。
图1-3 记事本系统流程图

1.4开发及运行环境

  1. 开发平台:win8/win10, Eclipse 及 ADT。
  2. 数据库:SQLite
  3. JDK:1.7 及以上
  4. Android 版本:4.3
  5. 运行设备:android 手机或 android 平板

2 预期目标
时代飞速的发展,使得人们在生活与工作中都忙忙碌碌的,很多时候都会忘记一些事情。早在古代,人们就想出了一些解决方法,但由于思考的不周全,从而让这些方法都成为了泡影。而在科技发达的现代,想要记住一些事情可以很简单。
记事本这款软件的出现,恰好能解决这一问题。记事本可以很方便的帮你管理琐碎的文字记录,通过记事本,使我们的相关日程安排非常清晰。
2.1性能需求
由于android系统本身的资源限制以及用户手机设备的硬件性能问题,该记事本在性能上需要满足以下几点要求
能够兼容低版本的android系统
内存占用尽量少,不能出现内存泄露的问题
CPU资源占用尽量少,各种交互操作响应速度要快,不能出现卡死或者不流畅的问题
2.2记事本功能
因为没有使用过记事本程序,对这方面比较缺乏了解,参考了比较流行的记事本程序设计,然后综合考虑各方面因素,对这个记事本程序的功能设计进行了简化,只实现了基本的记事本功能。
特色功能:
(1)记事本管理(新建、保存、删除、查看、修改内容)
(2)记事本操作(新建、保存、删除、查看、修改内容)
(3)背景音乐
(4)开机自启动记事本
(5)外部应用程序能对记事本进行操作
2.3 构成模块
(1)整个系统大体可以分成两大模块:
一是记事本管理,主要是显示记事本和新建记事本;
二是记事本操作,想要对记事本内容操作时,点击对应的操作按钮即可弹出该界面。
(2)总的系统组织结构图如图2-1所示
图2-1记事本系统组织结构

3 项目实施
3.1 关键程序步骤
3.1.1 Activity数据传递
(1)运用Intent语句实现两个界面的跳转

Intent intent = new Intent(LoginActivity.this,NotepadActivity.class);
startActivity(intent);
finish();

(2)用于Activity之间的通讯intent为A传来的带有Bundle的intent,当然也可以自己定义新的Bundle

intent = new Intent(); 				
startActivityForResult(intent, 1);
setResult(RESULT_OK, intent); 
finish();//此处一定要调用finish()方法

(3)主界面和编辑界面的数据传送

intent.putExtra("id", cursor.getString(cursor.getColumnIndex("_id")));
intent.putExtra("state", ALERT_STATE);
intent.putExtra("title",cursor.getString(cursor.getColumnIndex("title")));
intent.putExtra("time",cursor.getString(cursor.getColumnIndex("time")));
intent.putExtra("content",cursor.getString(cursor.getColumnIndex("content")));
//设置并启动另一个指定的Activity
intent.setClass(NotepadActivity.this, NotepadEditActivity.class);
NotepadActivity.this.startActivity(intent);

(4)获取启动该主界面的intent对象

if(state == ALERT_STATE){//修改状态,赋值控件
id = intent.getStringExtra("_id");
titleText = intent.getStringExtra("title");
contentText = intent.getStringExtra("content");
timeText = intent.getStringExtra("time");			
title.setText(titleText);
content.setText(contentText);

(5)主界面和查看界面的数据传送

Intent intent = new Intent();				
intent.putExtra("id", cursor.getString(cursor.getColumnIndex("_id")));
intent.putExtra("title",cursor.getString(cursor.getColumnIndex("title")));
intent.putExtra("time",cursor.getString(cursor.getColumnIndex("time")));
intent.putExtra("content",cursor.getString(cursor.getColumnIndex("content")));
intent.setClass(NotepadActivity.this, NotepadCheckActivity.class);
NotepadActivity.this.startActivity(intent);

(6)获取数据

Intent intent = getIntent();//获取启动该Activity的intent对象
String id = intent.getStringExtra("_id");
String title= intent.getStringExtra("title");
String time= intent.getStringExtra("time");
String content = intent.getStringExtra("content");

3.1.2 数据存储
本项目中使用内部存储实现了编辑界面内容的存储,使用sharedPreference存储实现了登录界面账号和密码的存储.相关源代码如下:
(1)使用内部存储实现了编辑界面标题的存储

public class AddRecordListener1 implements OnClickListener {
		public void onClick(View v) {
			// TODO Auto-generated method stub
			titleText = title.getText().toString();
			contentText = content.getText().toString();
			TextView editTitle = null;
			// addinfo=editTitle.getText().toString().trim();
			// String addRecordButtoninfo="123";
			FileOutputStream fos;
			// 保存数据
			try {
				fos = openFileOutput("data.txt", Context.MODE_APPEND);
				fos.write(titleText.getBytes());
				fos.close();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			Toast.makeText(NotepadEditActivity.this, "数据保存成功", 0).show();
		}
	}

(2)使用sharedPreference存储实现了登录界面账号和密码的存储

public class Utils {
	public static boolean saveUserInfo(Context context, String id,
			String password) {
		SharedPreferences sp = context.getSharedPreferences("sp",
				Context.MODE_PRIVATE);
		Editor edit = sp.edit();
		edit.putString("login_02", id);
		edit.putString("login_03", password);
		edit.commit();
		return true;
	}
	public static Map<String, String> getUserInfo(Context context) {
		SharedPreferences sp = context.getSharedPreferences("sp",
				Context.MODE_PRIVATE);
		String id = sp.getString("login_02", null);
		String password = sp.getString("login_03", null);
		Map<String, String> userMap = new HashMap<String, String>();
		userMap.put("login_id", id);
		userMap.put("login_password", password);
		return userMap;
	}}
public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.login_layout);
		sp = this.getSharedPreferences("sp", Context.MODE_WORLD_READABLE);
		login_id = (EditText) findViewById(R.id.login_id);
		login_password = (EditText) findViewById(R.id.login_password);
		login_picture = (ImageView) findViewById(R.id.login_picture);
		rememberpassword_login = (CheckBox) findViewById(R.id.rememberpassword);
		auto_login = (CheckBox) findViewById(R.id.auto_login);
		btn_login = (Button) findViewById(R.id.button_login);
		if (sp.getBoolean("ischeck", false)) {
			rememberpassword_login.setChecked(true);
			login_id.setText(sp.getString("PHONEEDIT", ""));
			login_password.setText(sp.getString("PASSWORD", ""));
			login_password.setInputType(PASSWORD_MIWEN);
			if (sp.getBoolean("auto_ischeck", false)) {
				auto_login.setChecked(true);
				Intent intent = new Intent(LoginActivity.this,
						NotepadActivity.class);
				startActivity(intent);
			}
		}
			btn_login.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				login_id.getPaint().setFlags(0);
				idvalue = login_id.getText().toString();
				login_password.getPaint().setFlags(0);
				passwordvalue = login_password.getText().toString();
				if (idvalue.equals("123456") && 
passwordvalue.equals("123456")) {
					if (rememberpassword_login.isChecked()) {
						SharedPreferences.Editor editor = sp.edit();
						editor.putString("PHONEEDIT", idvalue);
						editor.putString("PASSWORD", passwordvalue);
						editor.commit();
					}
					Intent intent = new Intent(LoginActivity.this,
					NotepadActivity.class);
					startActivity(intent);
					finish();
				} else {
				Toast.makeText(LoginActivity.this, "账号或密码错误,请重新登录",
							Toast.LENGTH_SHORT).show();}}});
		rememberpassword_login
				.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
					public void onCheckedChanged(CompoundButton buttonView,
							boolean isChecked) {
						if (rememberpassword_login.isChecked()) {
							System.out.println("记住密码已选中");
							sp.edit().putBoolean("ischeck", true).commit();
						} else {
							System.out.println("记住密码没有选中");
							sp.edit().putBoolean("ischeck", false).commit();
						}
					}
				}};		

3.1.3 内容提供者
内容提供者是Android系统中专门为应用程序之间的数据通讯开发的,正常来说应用程序之间是不允许数据通信的,但是内容提供者的作用就是让别的应用程序访问我们的数据库,我们需要建立两个应用程序,一个作为内容提供者,一个作为内容解析器(访问者)调用指定的APP的增删改查方法。
(1)创建一个数据库帮助类,用于数据的存储和访问

public class DatabaseHelper extends SQLiteOpenHelper {
	private String tableName = "record";
	private String sql = "create table if not exists "
	                      + tableName 
	                      + "(_id integer primary key autoincrement, " 
	                      + "title varchar,"
	                      + "content text,"
	                      + "time varchar)";
	public DatabaseHelper(Context context, String name, CursorFactory factory,
			int version) {
		super(context, name, factory, version);
		// TODO Auto-generated constructor stub
	}
	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		//创建表	
		db.execSQL(sql);
	}
@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
	}
}

(2)自定义一个内容提供者—创建一个类继承自contentProvider

public class ContentProvider extends android.content.ContentProvider {
	private DatabaseHelper helper;
	private SQLiteDatabase db;
	private int id;
	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
	  DatabaseHelper helper = new DatabaseHelper(getContext(), "notepad.db", null, 1);
		SQLiteDatabase db = helper.getWritableDatabase();
		db.delete("record", "id=?", new String[]{id+""});
		db.close();
		return 0;
	}
	@Override
	public String getType(Uri uri) {
		// TODO Auto-generated method stub	
		return null;
	}
	@Override
	public Uri insert(Uri uri, ContentValues values) {
		// TODO Auto-generated method stub
		//System.out.println("insert()");
	  DatabaseHelper helper = new DatabaseHelper(getContext(), "notepad.db", null, 1);
		SQLiteDatabase db = helper.getWritableDatabase();
		db.insert("record", null, values);
		db.close();
		return null;
	}
	@Override
	public boolean onCreate() {
		// TODO Auto-generated method stub
		helper = new DatabaseHelper(getContext(),"notepad.db",null,1);
        db = helper.getReadableDatabase();
        return  true;
	}
	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		// TODO Auto-generated method stub
		//DatabaseHelper helper = new DatabaseHelper(getContext(), "notepad.db", null, 1);   		
//SQLiteDatabase db = helper.getWritableDatabase();
		//Cursor c = db.rawQuery("select * from person where id=?", new String[]{"1"});
		//Cursor c = db.query("record", null, "id=?", new String[]{}, null, null, null);
		return null;
	}
	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		// TODO Auto-generated method stub
		return 0;
	}
}

(3)在清单文件中进行注册,表明本APP开启了一个内容提供者

<provider
            android:name="ah.sz.notepad.ContentProvider"
            android:authorities="ah.sz.notepad.ContentProvider" />

(4)自定义一个内容解析器,实现从外部对数据进行操作

public class MainActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		ContentResolver resolver = getContentResolver();
		Uri uri = Uri.parse("content://ah.sz.notepad.ContentProvider");
		long datetime = System.currentTimeMillis();
		ContentValues values = new ContentValues();
		values.put("title", "我是内容解析器新插入的哦!");
		values.put("content", "啦啦啦,成功了!开心!");
		values.put("time", datetime);
		resolver.insert(uri, values);
		System.out.println("内容解析器——插入记事成功");
		resolver.insert(uri, values);
	}

3.1.4 广播接收者
(1)开机自启动基本原理
图3-1 开机自启原理图
当Android系统开机后,系统会发送一个“已开机”的广播。需要开机自启动的程序接收这个广播,然后启动自己的活动即可。
(2)创建类
自定义广播接收器在需要自启动的程序中,需要创建广播接收器来接收广播。类BroadcastReceiver表示广播接收器,所以在程序中创建一个该类的派生类即可。广播接收器类的创建选中MainActivity类所在的文件夹,之后在右键菜单中选择“New->Java Class”,弹出“Create New Class”对话框。接下来在该对话框中,将创建的广播接收器类的名称设置为“BootBroadcastReceiver”,并将该类的父类(Superclass)设置为“android.content.BroadcastReceiver”,最后点击“OK”按键。
(3)广播接收器类的实现
对于自定义的BroadcastReceiver类的派生类,必须重写其父类的onReceive()函数。当广播接收器收到指定的广播后,就会调用该函数。对于需要开机自启动的程序,其广播接收器收到开机的广播后,就要启动自己的主活动。所以,对于BootBroadcastReceiver类来说,其onReceive()函数的主要流程为首先判断收到的广播是否是系统已启动的广播,如果是,则启动自己的主活动。

public class BootBroadcastReceiver extends BroadcastReceiver {
	 public static final String ACTION = "android.intent.action.BOOT_COMPLETED";
	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		 if (intent.getAction().equals(ACTION)) {
	            Intent welcomeIntent = new Intent(context, LoginActivity.class);
	            context.startService(welcomeIntent);
		 }
	}
}

(4)onReceive()方法该方法有两个参数,其中context表示广播接收器所运行的上下文;intent表示广播接收器收到的Intent。
(5)收到广播类型的判断在onReceive()方法中,首先通过收到的intent判断广播类型。getAction()方法的作用是获取接收到的Intent的动作。ACTION是定义的字符串。
public static final String ACTION = “android.intent.action.BOOT_COMPLETED”;
//其中,android.intent.action.BOOT_COMPLETED是已开机广播对应的字符串。
(6)启动主活动当收到的广播是已开机广播,则通过Intent来启动主活动。其中,MainActivity是主活动对应的类名; FALG_ACTIVITY_NEW_TASK表示创建一个新任务来启动该主活动。最后,通过startActivity()方法启动主活动。
(7)配置接收器在AndroidManifest.xml文件的标签中,加入如下代码。

 <receiver android:name="ah.sz.notepad.BootBroadcastReceiver" >
        <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

其中,标签表示的是广播接收器,指定了该广播接收器接收的广播类型,“android.intent.action.BOOT_COMPLETED”即为系统启动完成的广播。当安卓系统启动完成后,会向所有程序发送系统气功完成的广播,本系统通过以上静态配置,即可接收该广播,并调用自定义类BootBroadcastReceiver的onReceive()方法启动自己的主活动,实现开机自启动功能。
(8) 程序权限的提升必须提升程序的权限才能收到系统启动完成的广播。权限的提升也是通过在AndroidManifest.xml中进行配置实现的。在标签之外添加如下代码。

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
//其中,<uses-permission>标签标识应用程序权限。

“android.permission.RECEIVE_BOOT_COMPLETED”是系统启动完成广播对应的字符串。以上代码的作用是为程序的用户权限添加接收系统启动完成广播的权限。
3.1.5 Service
加入背景音乐,通过使用service来实现。实现这个功能并不需要界面,所以就可以用到service这个组件。其作用与activity类似,只是没有界面,不需要布局文件。
(1)实现功能的第一步,先建立一个继承自service的服务,在里面设定启动mediaplayer,代码如下:

package ah.sz.notepad;
//import java.io.IOException;
import com.notepad.namespace.R;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
public class AudioService extends Service {
	private MediaPlayer player;
	public IBinder onBind(Intent intent)
	{
		return null;
	}
	public void onStart(Intent intent, int startId){
 		if(player == null)
		{
			player = MediaPlayer.create(this, R.raw.song);
			player.setLooping(true);
			player.start();
		}
	}
	public void onDestroy(){
		player.stop();
		super.onDestroy();
	}
}

(2)service和activity一样,都需要在AndroidMenifest中进行定义,以下为AndroidMenifest中对该service的定义(该部分定义,需要在application中):

(3)然后,就是在主程序中对该service的调用了,代码如下:

private Intent AudioIntent = new Intent("com.MiniNotepad.service.BIND_SERVICE");
   boolean serviceFlag = false;
   @Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		if (serviceFlag == false) {
			startService(AudioIntent);
			serviceFlag = true;
		}

在MainActivity中的onCreate方法中对service进行启动,同时添加了一个flag,可以保证在重复调用该activity的时候不多次启动service。
(4)最后在MainActivity的onDestory方法中,对该service进行终结,代码如下:

protected void onDestroy() {
// 销毁Activity之前,所做的事
		stopService(AudioIntent);
		serviceFlag = false;
//关闭游标
       cursor.close();
		super.onDestroy();
	}

以上,通过调用service,成功地在记事本中添加了背景音乐,随着MainActivity的启动,背景音乐响起,退出程序的时候,音乐停止。
3.2 实验结果

图3-1登录界面显示

图3-2登录失败界面

图3-3主界面显示

图3-4新增界面显示

图3-5功能界面显示

图3-6修改界面显示

图3-7查看界面显示

图3-8内部存储文件

图3-9 sharedPreference存储文件

图3-10 内容解析器

图3-11 内容提供者(1)

图3-12 内容提供者(2)

图3-13 SQLite数据库内容显示

4 心得体会
4.1 心得体会一
这次Android项目的开发,不仅让我们很好的巩固了上课所学的知识,而且体会到了团队合作的重要性。同时,在项目功能实现的过程中,也深刻的意识到自己还有很多知识点没有掌握透彻,需要我们去深入探究。整个项目耗费的时间相对来说还是挺长的,但我们相信付出了就会有回报。
在我们明确项目的分工后,就开始各自的功能实现,在这个过程中,出现了各种各样的问题,不能把书上的知识点灵活的运用到我们的项目上,理论应用到实际问题还是有一定的难度。大家有不会的就会在书本上或者上网查阅相关知识点,如果还是理解不透彻就会询问组员,大家一起相互讨论问题到最后都一一解决了。大家一起完成了基于Android下的记事本的设计与开发这个项目,从开始的无从下手,到初见雏形,再到逐渐完善。这一幕幕的画面,无不让人对自己所实现的功能而感到自豪,一行行代码间,流露出来的不只是大家付出的汗水,还有大家坚持不放弃任何一个功能的那份执着的心。这种小组活动,团队之间的协助显得尤为重要,作为团队开发类项目,我们不可能哪一个人把项目做完,需要大家分工合作,共同完成整个项目的开发,这样才能体现出团队的价值,在整个开发的过程中,大家各司其职,同时还会常与队员讨论彼此之间代码和功能之间的联系。
通过这次的课程设计,认识到不管什么时候都要相信自己可以,如果一开始就否定自己,那怎么可能继续坚持下去!遇到了困难不要害怕,要以平常心对待,问题总会有解决的办法。很多时候一些问题你觉得很难,但可能你多查阅一些资料后,就会发现其实并没有那么难,前提是需要你去认真钻研。
4.2 心得体会二
学习android不仅是对前沿开发技术的了解,也是对编程知识的一次提升。我们项目的主题是记事本的开发与设计。很多的功能让我们这群菜鸟无从下嘴,但在我们这群崛起的码农面前,这些都不是问题,经过我们的商讨下,最终确立了需求,需求就像我们的人生航标一样,有了它,我们的开发才有方向,不然都是无用的。在这个项目中,主要实现以下几个功能:Activity数据传递、内部存储和sharedPreferecce保存数据、内容提供者、广播接收者、service.Activity部分,Intent 可以启动一个Activity,也可以在启动Activity的时候传递数据。intent中提供了putExtra()方法,它可以把我们想要传递的数据暂存intent中,启动了另一个Activity后,通过getIntent().getStringExtra()(其中getStringExtra()通过活动传递的数据类型决定是String或是其他类型),再从 Intent中取出。内部存储和sharedPreferecce保存数据部分,实现的是利用sharedPreferecce实现保存登录界面的账号和密码,首先是新建一个Utils类,用于实现账号和密码的保存和读取,然后通过设置监听事件,使之实现在选中记住密码按钮后实现数据的存储,这样就完成了登录界面的数据存储。紧接着通过新建FileOutputStream对象来保存编辑界面中的内容。内容提供者是Android系统中专门为应用程序之间的数据通讯开发的,正常来说应用程序之间是不允许数据通信的,但是内容提供者的作用就是让别的应用程序访问我们的数据库,我们需要建立两个应用程序,一个作为内容提供者,一个作为内容解析器(访问者)调用指定的APP的增删改查方法。广播接收者部分实现了开机自启。service部分,先建立一个继承自service的服务,在里面设定启动mediaplayer,然后在AndroidMenifest中进行定义,接着在主程序中对该service的调用起初,最后,在MainActivity的onDestory方法中,对该service进行终结,就实现了在记事本中添加背景音乐。
经过大家坚持不懈的努力,项目终于开发出来了,大家都开心不已,这是我们大家共同做出来的一个APP,虽然还有些功能不够完善,但这种经历是很难得的,完成简单的记事本软件不仅可以初步了解Android开发的基本的使用以及训练我们的开发能力,还对于我们毕业以后从事Android开发或者其他的开发奠定一定的基础,我们要不断加强自身能力的培养。

5 附录
5.1 小组成员
(略)
5.2 成员分工
(略)
5.3 源程序
主要部分源代码:
(1)LoginActivity.java内容代码:

package com.notepad.namespace;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
public class LoginActivity extends Activity 
{
	private EditText login_id;
    private EditText login_password;
    private ImageView login_picture;
    private CheckBox rememberpassword_login;
    private CheckBox auto_login;
    private Button btn_login;
    private SharedPreferences sp;
    private String idvalue;
    private String passwordvalue;
    private static final int PASSWORD_MIWEN = 0x81;
	
	public void onCreate(Bundle savedInstanceState) 
{
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login_layout);
        sp = this.getSharedPreferences("userInfo", 
Context.MODE_WORLD_READABLE);
      //到相应的布局及控件
        login_id=(EditText) findViewById(R.id.login_id);
        login_password=(EditText) findViewById(R.id.login_password);
        login_picture=(ImageView) findViewById(R.id.login_picture);
        rememberpassword_login=(CheckBox) findViewById(R.id.rememberpassword);
        auto_login=(CheckBox) findViewById(R.id.auto_login);
        btn_login=(Button) findViewById(R.id.button_login);
        if (sp.getBoolean("ischeck",false))
{
            rememberpassword_login.setChecked(true);
            login_id.setText(sp.getString("PHONEEDIT",""));
            login_password.setText(sp.getString("PASSWORD",""));
            //密文密码
            login_password.setInputType(PASSWORD_MIWEN);
            if (sp.getBoolean("auto_ischeck",false))
{
                auto_login.setChecked(true);
                Intent intent = new Intent(LoginActivity.this,NotepadActivity.class);
                startActivity(intent);
            }
        }
        btn_login.setOnClickListener(new OnClickListener() 
{
			
			public void onClick(View v)
 {
				// TODO Auto-generated method stub
				login_id.getPaint().setFlags(0);
                idvalue=login_id.getText().toString();
                login_password.getPaint().setFlags(0);
                passwordvalue=login_password.getText().toString();
                if (idvalue.equals("123456")&&passwordvalue.equals("123456"))
{
                    if (rememberpassword_login.isChecked())
{
                        SharedPreferences.Editor editor=sp.edit();
                        editor.putString("PHONEEDIT",idvalue);
                        editor.putString("PASSWORD",passwordvalue);
                        editor.commit();
                    }
				Intent intent = new Intent(LoginActivity.this,NotepadActivity.class);
				startActivity(intent);
				finish();
               }else{
                    Toast.makeText(LoginActivity.this, "账号或密码错误,请重新登录", Toast.LENGTH_SHORT).show();
                }
            }
        });
        rememberpassword_login.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (rememberpassword_login.isChecked()){
                    System.out.println("记住密码已选中");
                    sp.edit().putBoolean("ischeck",true).commit();
                }
                else {
                    System.out.println("记住密码没有选中");
                    sp.edit().putBoolean("ischeck",false).commit();
                }
            }
        });
auto_login.setOnCheckedChangeListener(newCompoundButton.OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (auto_login.isChecked()){
                    System.out.println("自动登录已选中");
                    sp.edit().putBoolean("auto_ischeck",true).commit();
                }else {
                    System.out.println("自动登录没有选中");
                    sp.edit().putBoolean("auto_ischeck",false).commit();
                }
            }
        });
    }
}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐