Android四大组件

2019-03-31  本文已影响0人  抱不住太阳的深海line

文章结构


Activity

生命周期
onCreate() → onStart() → onResume() → onPause() → onStop() → onDestroy()

异常情况下的生命周期

当内存不足或者系统资源配置发生改变都会使Activity杀死,此时系统会调用onSaveInstance来保存当前Activity的状态,当Activity重新创建后,系统会调用onRestoreInstanceState并将Bundle对象传递给onCreate方法。

Activity的启动模式

Activity启动方式

<activity
         android:name=".one.TwoActivity">
         <intent-filter>
               <action android:name="com.example.one.ACTION_START"></action>
               <category android:name="android.intent.category.DEFAULT"></category>
               <category android:name="com.example.one.ACTION_START"></category>
         </intent-filter>
</activity>

启动Activity

Intent intent = new Intent("com.example.one.ACTION_START");
//android.intent.category.DEFAULT是一种默认的category,在startActivity时自动添加
intent.addCategory("com.example.one.ACTION_START");
startActivity(intent);

Service

注:服务一旦创建就不会再次创建了,他会调用onSstartCommand方法,同一个服务可以多个Activity调用

public class MyService extends Service {

    private static final String TAG = "MyService";

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "onCreate: ");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(TAG, "onStartCommand: ");
        new Thread(){
            @Override
            public void run() {
                int i = 10;
                while(i-->0)
                    Log.i(TAG, "run: "+i);
            }
        }.start();
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "onDestroy: ");
    }
}

当然别忘了注册。

 <service
    android:name=".two.MyService"
    android:enabled="true"
    android:exported="true" />

好了,我们就可以在Activity中启动和停止服务了。

 startService(new Intent(this,MyService.class));
 stopService(new Intent(this,MyService.class));

有的时候我们可能因为大意忘了关掉服务怎么办,可以用bindService。

public class MyService2 extends Service {
    public MyService2() {
    }

    @Override
    public IBinder onBind(Intent intent) {
       return new MyBinder();
    }

    @Override
    public boolean onUnbind(Intent intent) {
        return super.onUnbind(intent);
    }

    class MyBinder extends Binder{
        public void showToast(){
            Log.i("MyService2", "showToast");
        }
        public void showList(){
            Log.i("MyService2", "showList");
        }
    }
}

这里只做两个事,显示Toast和显示列表(别忘了注册),接下来是绑定服务和解除绑定服务。

ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //拿到后台服务代理对象
            MyService2.MyBinder myBinder = (MyService2.MyBinder) service;
            //调用方法
            myBinder.showToast();
            myBinder.showList();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };
//绑定服务启动
bindService(new Intent(this,MyService2.class),conn,BIND_AUTO_CREATE);
//解除绑定
unbindService(conn);
public class MyService3 extends Service {
    public MyService3() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        showNotification();
    }

    private void showNotification() {
        //创建通知详细信息
        Notification.Builder builder = new Notification.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("2019年3月31日")
                .setContentText("今天天气晴,0到14度");
        //创建点击跳转Intent
        Intent intent = new Intent(this,ZeroActivity.class);
        //创建人物栈Builder
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
        stackBuilder.addParentStack(ZeroActivity.class);
        stackBuilder.addNextIntent(intent);
        PendingIntent pendingIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);
        //设置跳转Intent到通知中
        builder.setContentIntent(pendingIntent);
        //获取通知服务
        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        //构建通知
        Notification notification = builder.build();
        //显示通知
        notificationManager.notify(0,notification);
        //启动为前台服务
        startForeground(0,notification);
    }

启动服务

startService(new Intent(this,MyService3.class));
  1. 判断wifi是否开启
WifiManager wm = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
boolean enabled = wm.isWifiEnabled();
  1. 获取系统最大音量
AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE);
int max = am.getStreamMaxVolume(AudioManager.STREAM_SYSTEM);
  1. 获取当前音量
 AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE);
 int current = am.getStreamMaxVolume(AudioManager.STREAM_RING);
  1. 判断网络是否有连接
ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
boolean isAvailable = info.isAvailable();

广播

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("BroadcastReceiver", "广播收到了");
//      abortBroadcast(); 这个函数的功能是清除广播,在有序时调用
    }
}

注册广播

<receiver
    android:name=".three.MyReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter android:priority="100">
    <action android:name="test" />
    </intent-filter>
</receiver>

发送广播

//无序广播
sendBroadcast(Intent intent);
//有序广播
sendOrderedBroadcast(Intent intent,String receiverPermission);

广播也可以动态注册,下面用本地广播做个例子。

public class MyLocalBroadcaseReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("local", "本地广播收到了");
    }
}

Activity中可以这样用

IntentFilter intentFilter = new IntentFilter("test");
LocalBroadcastManager manager =  LocalBroadcastManager.getInstance(this);
//注册广播
manager.registerReceiver(myLocalBroadcaseReceiver,intentFilter);
//发送广播
manager.sendBroadcast(new Intent("test"));
//最后别忘了解除广播(在Activity关闭或广播结束时调用)
manager.unregisterReceiver(myLocalBroadcaseReceiver);

内容提供者

ContentProvider主要用于不同的应用之间实现数据共享。

public class TelContentProvider extends ContentProvider {
    private DBHelper helper = null;
    private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);// 默认的规则是不匹配的
    static{
        URI_MATCHER.addURI("com.example.tel","tel",2);
        URI_MATCHER.addURI("com.example.tel","tel/#",1);
    }
    @Override
    public boolean onCreate() {
        helper = new DBHelper(getContext(),"tel.db",null,1);
        return true;
    }

    @Override
    public String getType(Uri uri) {
        int flag = URI_MATCHER.match(uri);
        switch (flag){
            case 1:
               return "vnd.android.cursor.item/tel";
            case 2:
                return "vnd.android.cursor.dir/tels";
        }
        return null;
    }

    @Override
    public Cursor query(Uri uri, String[] projection,String selection,  String[] selectionArgs,String sortOrder) {
        Cursor cursor = null;
        int flag = URI_MATCHER.match(uri);
        SQLiteDatabase database = helper.getWritableDatabase();
        switch (flag){
            case 1:
                long id = ContentUris.parseId(uri);
               cursor =  database.query(true,"tel",null,"id = ?",new String[]{String.valueOf(id)},null,null,null,null);
                break;
            case 2:
              cursor =   database.query(true,"tel",null,selection,selectionArgs,null,null,null,null);
                break;
        }

        return cursor;
    }
    @Override
    public Uri insert( Uri uri,ContentValues values) {
        Uri resultUri = null;
        int flag =URI_MATCHER.match(uri);
        switch (flag){
            case 2:
                resultUri = ContentUris.withAppendedId(uri,insertTels(values));
                break;
        }
        return resultUri;
    }

    private long insertTels(ContentValues values) {
        long id = -1;
        SQLiteDatabase database  = helper.getWritableDatabase();
        id = database.insert("tel",null,values);
        return id;
    }

    @Override
    public int delete(Uri uri,String selection, String[] selectionArgs) {
        int count = -1;
        SQLiteDatabase database = helper.getWritableDatabase();
        int flag = URI_MATCHER.match(uri);
        switch (flag){
            case 1:
                long id = ContentUris.parseId(uri);
                count = database.delete("tel","id = ?",new String[]{String.valueOf(id)});
                break;
            case 2:
               count =  database.delete("tel",selection,selectionArgs);
                break;
        }
        return count;
    }

    @Override
    public int update(Uri uri,ContentValues values, String selection,String[] selectionArgs) {
        int count = -1;
        int flag = URI_MATCHER.match(uri);
        SQLiteDatabase database = helper.getWritableDatabase();
        switch (flag){
            case 1:
                long id = ContentUris.parseId(uri);
                count =database.update("tel",values,"id = ?",new String[]{String.valueOf(id)});
                break;
            case 2:
                count = database.update("tel",values,selection,selectionArgs);
                break;
        }
        return count;
    }
}

其中DBHelper类用于初始化数据库

public class DBHelper extends SQLiteOpenHelper {

    public DBHelper(Context context ,String name,SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // id 姓名 电话
        String sql = "create table tel(id integer primary key autoincrement," +
                "name varchar(20)," +
                "tel varchar(20))";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //暂时不考虑
    }
}

别忘了注册

<provider
    android:name=".four.TelContentProvider"
    android:authorities="com.example.tel" />

下面是测试代码

 ContentResolver contentResolver = getContentResolver();
 Uri uri = Uri.parse("content://com.example.tel/tel");
 //insert
 ContentValues insertValues = new ContentValues();
 insertValues.put("name","张三");
 insertValues.put("tel","13211111111");
 contentResolver.insert(uri,insertValues);
 //query all
 Cursor cursor = contentResolver.query(uri,null,null,null,null);
 while(cursor.moveToNext()){
     Log.i("query", "name = "+cursor.getString(cursor.getColumnIndex("name")));
 }
 //update by id
 uri = Uri.parse("content://com.example.tel/tel/1");
 ContentValues updateValues = new ContentValues();
 updateValues.put("name","李四");
 updateValues.put("tel","12345678911");
 contentResolver.update(uri,updateValues,null,null);
 //update by name
 uri = Uri.parse("content://com.example.tel/tel");
 ContentValues updateValues2 = new ContentValues();
 updateValues2.put("name","李四");
 updateValues2.put("tel","98765432111");
 contentResolver.update(uri,updateValues2,"name = ?",new String[]{"李四"});
//delete all
contentResolver.delete(uri,null,null);
//delete by id
uri = Uri.parse("content://com.example.tel/tel/1");
contentResolver.delete(uri,null,null);
//delete by name
uri = Uri.parse("content://com.example.tel/tel");
contentResolver.delete(uri,"name = ?",new String[]{"张三"});
Uri uri = Uri.parse("content://sms");
ContentResolver resolver = getContentResolver();
Cursor cursor =  resolver.query(uri,null,null,null,null);
while (cursor.moveToNext()){
Log.i("test", "body"+cursor.getString(cursor.getColumnIndex("body")));
}

注意:需要权限

上一篇 下一篇

猜你喜欢

热点阅读