数据库部分、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信息,说明广播经过第一个接收器之后就终止了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2、Android架构有四层,分别是 、 、 和 。 3、Android开发时常用的像素单位是 和 。 4、Activity的生命周期分为三个阶段,分别是 、 和 。 5、当Activity可见的过程是从调用 方法开始,直到调用 方法结束。 6、数据库的操作方法分为 和 。 7、rawQuery()方法会把查询的结果包装在一个 对象中返回,可以对结果集进行向前、向后或随机的访问。。 9、Service的启动方式有通过 方法启动和通过 方法启动。 11、Android是一种基于 系统的自由且开放源代码的操作系统。 12、Android四大组件分别是 、 、 和 。 13、常用的文本类控件有 和 。 14、Activity生命周期中有四种状态,分别是 、 和 。 15、Activity的完整生命周期从调用 方法开始,直到调用 方法结束。 16、查询数据库时,会把查询的结果包装在一个 对象中返回,可以对结果集进行向前、向后或随机的访问。 17、Android系统播放音频和视频,分别使用 类和 类。 18、Android广播事件的注册方式有两种,分别是 和 。 19、SQLiteOpenHelper类是一个抽象类,定义了创建、打开和 数据库的方法。 20、Android中最常用的布局方式是 和 。 21、Android布局中的边距有2种,分别是 和 。 22、对数据库的操作分为 、 、 和 四种。 23、共享偏好设置中保存设置的代码一般写入 方法中,从共享偏好设置中读取数据的代码,一般写入 方法中。  
06-11

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值