數據庫的增刪改查
部分代碼,增刪改比較簡單,查較爲麻煩,參數的設定可以按照不同的方式查找數據
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信息,說明廣播經過第一個接收器之後就終止了。