数据库的增删改查
部分代码,增删改比较简单,查较为麻烦,参数的设定可以按照不同的方式查找数据
public void onClick(View view) {
switch (view.getId()){
case R.id.button_create_db:
break;
case R.id.button_insert:
ContentValues values = new ContentValues();
values.put("name",mEditTextUsername.getText().toString());
values.put("password",mEditTextPassword.getText().toString());
db.insert("user",null,values);
break;
case R.id.button_delete:
db.delete("user","name=?",new String[]{"zhangsan"});
Toast.makeText(MainActivity.this,"删除数据",Toast.LENGTH_SHORT).show();
break;
case R.id.button_update:
ContentValues values1 = new ContentValues();
values1.put("password","abcd");
db.update("user", values1, "name=?", new String[]{"zhangsan"});
Toast.makeText(MainActivity.this,"修改了数据",Toast.LENGTH_SHORT).show();
break;
case R.id.button_select:
// Cursor cursor = db.rawQuery("select * from user where name=? password=?",null);
Cursor cursor = db.query("user",null,null,null,null,null,"id DESC ","3");//2是偏移量,3是查询的数量
cursor.moveToFirst();
while (!cursor.isAfterLast()){
String name = cursor.getString(cursor.getColumnIndex("name"));
String password = cursor.getString(cursor.getColumnIndex("password"));
Log.d("cursor","用户名"+ name +"密码"+ password);
cursor.moveToNext();
}
break;
default:
break;
}
}
也可以使用xUtils查询数据库,具体操作:
case R.id.button_select:
DbUtils dbUtils = DbUtils.create(this,"my_first_db");
try {
List<User> users = dbUtils.findAll(Selector.from(User.class));
for (User user:users){
Log.d("cursor","用户名"+user.getName()+" 密码"+user.getPassword());
}
} catch (DbException e) {
e.printStackTrace();
}
ContentProvider
内容提供者,四大组件之一,但是不常用,一般用于读取手机联系人,读取图片,写一个读取手机联系人的Demo
还要注意在manifest里面加入权限
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
public class MainActivity extends Activity {
private Button mButton;
private ContentResolver resolver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = (Button) findViewById(R.id.button);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
resolver = getContentResolver();
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
Cursor cursor = resolver.query(uri,new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME},null,null,null);
cursor.moveToFirst();
while (!cursor.isAfterLast()){
String[]names = cursor.getColumnNames();
StringBuffer buffer = new StringBuffer();
for (String name:names){
String value = cursor.getString(cursor.getColumnIndex(name));
buffer.append("字段名:"+name+" 字段值:"+value);
}
Log.d("联系人",""+buffer);
cursor.moveToNext();
}
}
});
}
}
BroadcastReceiver
广播接收器,一个简单的演示例子,先写一个类,继承BroadcastReceiver,复写onReceiver
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"接受了广播",Toast.LENGTH_SHORT).show();
}
}
其中myReceiver = new MyReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(“com.myreceiver.test”);
registerReceiver(myReceiver, filter); 这四句和destroy方法的作用可以在manifest里面实现
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="com.myreceiver.test"/>
</action>
</intent-filter>
</receiver>
public class MainActivity extends Activity {
private Button mButtonsend;
private MyReceiver myReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myReceiver = new MyReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("com.myreceiver.test");
registerReceiver(myReceiver, filter);
mButtonsend= (Button) findViewById(R.id.button);
mButtonsend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setAction("com.myreceiver.test");
sendBroadcast(intent);
}
});
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myReceiver);
}
}
在上面代码的基础上写一个闹钟
public class MainActivity extends Activity {
private Button mButtonsend;
private Button mButtonAlarm;
private Button mButtonAlarmCancel;
private MyReceiver myReceiver;
private AlarmManager mAlarmManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myReceiver = new MyReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("com.myreceiver.test");
registerReceiver(myReceiver, filter);
mAlarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
mButtonsend= (Button) findViewById(R.id.button);
mButtonsend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setAction("com.myreceiver.test");
sendBroadcast(intent);
}
});
mButtonAlarm = (Button) findViewById(R.id.button_alarm);
mButtonAlarm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setAction("com.myreceiver.test");
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(),0x23,intent,PendingIntent.FLAG_UPDATE_CURRENT);
mAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+5000,3000,pendingIntent);
}
});
mButtonAlarmCancel = (Button) findViewById(R.id.button_cancel_alarm);
mButtonAlarmCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setAction("com.myreceiver.test");
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(),0x23,intent,PendingIntent.FLAG_UPDATE_CURRENT);
mAlarmManager.cancel(pendingIntent);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myReceiver);
}
}
Service
service,服务,后台默默工作着,看不到的东西。在这里给出一个简单的service,需要写一个类继承Service,复写一个方法,然后写onCreate,onStartCommand,onDestroy三个方法。还要注意在Manifest里面注册一下
public class MyService extends Service {
@Override
public void onCreate() {
super.onCreate();
Log.d("","onCreate");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("","onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("", "onDestroy");
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
public class MainActivity extends Activity implements View.OnClickListener{
private Button mButtonStart;
private Button mButtonStop;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButtonStart = (Button) findViewById(R.id.button_start);
mButtonStop = (Button) findViewById(R.id.button_stop);
mButtonStart.setOnClickListener(this);
mButtonStop.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.button_start:
Intent intent = new Intent(getApplicationContext(),MyService.class);
startService(intent);
break;
case R.id.button_stop:
Intent intent1 = new Intent(getApplicationContext(),MyService.class);
stopService(intent1);
break;
default:
break;
}
}
}
manifest里注册一下,在下面。
</activity>
<service android:name=".MyService">
</service>
2016-7-7 重新认识BroadcastReceiver
广播接收器的注册方法有两种:动态注册、静态注册。动态注册时在代码中实现的,需要在onCreate方法中写registerReceiver()方法,在onDestroy里写unregisterReceiver()方法。
动态注册广播
以监听网络连接的广播接收器为例,写一个广播接收器NetworkChangeReceiver继承BroadcastReceiver,复写onReceive方法,接受到的网络状态使用toast显示。BroadcastReceiver的复杂用法后面慢慢了解。
package com.example.broadcastactivity;
import android.support.v7.app.ActionBarActivity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class MainActivity extends ActionBarActivity {
private IntentFilter intentFilter;
private NetworkChangeReceiver networkChangeReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
networkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(networkChangeReceiver, intentFilter);
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
unregisterReceiver(networkChangeReceiver);
}
class NetworkChangeReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isAvailable()) {
Toast.makeText(MainActivity.this, "网络连接可用@#$%^&*", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(MainActivity.this, "网络连接不可用@#$%^&", Toast.LENGTH_SHORT).show();
}
}
}
}
静态注册广播
以监听系统开机广播为例,在AndroidManifest里面注册,并添加标签,具体写法如下:
<receiver android:name=".StaticBtroadcastReceiver">
<intent-filter >
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
以注册的接收器名字命名一个广播接收器StaticBtroadcastReceiver,继承BroadCastReceiver,并弹出Toast作为提示。
package com.example.broadcastactivity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class StaticBtroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Toast.makeText(context, "手机已开机", Toast.LENGTH_LONG).show();
}
}
监听系统开机广播也是需要声明权限的,需要在Manifest里面加入如下权限,并且在手机系统设置–>应用程序中,点开刚运行的APP,就能看到开机启动的权限。
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
activity里面不需要写任何东西,一个最简单的静态注册就完成了,关闭模拟器,然后重新打开,就能接收到弹出的Toast提示。
自定义广播
首先新建一个广播接收器CustomBroadcastReceiver,继承BroadCastReceiver,用来接收广播,如下:
package com.example.broadcastactivity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class CustomBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Toast.makeText(context, "接受到自定义广播", Toast.LENGTH_LONG).show();
}
}
然后在AndroidManifest里面注册该广播,并设置action。
<receiver android:name=".CustomBroadcastReceiver">
<intent-filter >
<action android:name="com.example.broadcastactivity.MY_CUSTOMBROADCAST"/>
</intent-filter>
</receiver>
在布局文件里添加一个按钮,作为发送广播的触发点。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/button_static"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="发送自定义广播"/>
</LinearLayout>
在activity的按钮的点击事件中添加相应逻辑:首先构建一个intent对象,并把要发送的广播的值传入,然后调用Contextd的sendBroadcast()方法将广播发送出去,这样,所有监听标签为”com.example.broadcastactivity.MY_CUSTOMBROADCAST”这条广播的广播接收器都会接受到消息。
package com.example.broadcastactivity;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class StaticBroadcastActivity extends Activity {
private Button mButtonSend;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_staticbroad);
mButtonSend = (Button) findViewById(R.id.button_static);
mButtonSend.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent = new Intent("com.example.broadcastactivity.MY_CUSTOMBROADCAST");
sendBroadcast(intent);
}
});
}
}
发送有序广播
广播是一种跨进程的通信方式,当一个应用程序发送广播时,其他应用程序也能接收到广播。
建立一个BroadCastActivity2 的项目,新建一个AnotherReceiver继承BroadcastReceiver,代码如下:
package com.example.broadcastactivity2;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class AnotherReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Toast.makeText(context, "接受另一个广播", Toast.LENGTH_LONG).show();
}
}
同样需要在Manifest里面进行注册,需要注意的是,注册的action需要和前一个项目的action一致。
<receiver android:name=".AnotherReceiver">
<intent-filter >
<action android:name="com.example.broadcastactivity.MY_CUSTOMBROADCAST"/>
</intent-filter>
</receiver>
运行此项目BroadCastActivity2 ,然后回到前一个项目的主界面,点击按钮,会弹出两次提示信息。
下面开始尝试有序广播,在BroadCastActivity2 项目中的sendBroadcast()方法改为sendOrderedBroadcast(),传入两个参数,第一个参数仍为intent,第二个参数是与权限相关的字符串,这里传入null。
package com.example.broadcastactivity2;
import android.support.v7.app.ActionBarActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends ActionBarActivity {
private Button mButtonSend;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButtonSend = (Button) findViewById(R.id.button_send_broadcast);
mButtonSend.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent = new Intent("com.example.broadcastactivity.MY_CUSTOMBROADCAST");
sendOrderedBroadcast(intent, null);
}
});
}
}
在第一个项目中,在Manifest里面注册时加入属性android:priority,此属性是给广播接收器设置优先级,优先级比较高的广播接收器可以先接受到广播,在此把第一个项目的优先级设置成100,保证它会在第二个项目之前接收到广播。
<receiver android:name=".CustomBroadcastReceiver">
<intent-filter android:priority="100">
<action android:name="com.example.broadcastactivity.MY_CUSTOMBROADCAST"/>
</intent-filter>
</receiver>
已经获得了接受广播的优先权,需要在onReceive()中调用abortBroadcast()方法,表示将这条广播截断,后面的广播接收器将无法接受到这条广播。
package com.example.broadcastactivity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class CustomBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Toast.makeText(context, "接受到自定义广播", Toast.LENGTH_LONG).show();
abortBroadcast();
}
}
运行程序,点击发送广播按钮,会发现,只能接受到第一个项目的Toast信息,说明广播经过第一个接收器之后就终止了。