數據庫部分、ContentProvider、BroadcastReceiver、Service

數據庫的增刪改查

部分代碼,增刪改比較簡單,查較爲麻煩,參數的設定可以按照不同的方式查找數據

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信息,說明廣播經過第一個接收器之後就終止了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章