android 四大组件

一、activity点击打开链接

二、service(可以看作是没有页面的activity):显性 和 隐形(已遗弃)

1.显性:onCreate - onStartCommand 只能手动关闭 -onDestroy    举个例子:音乐播放

继承自

extends Service

清单文件中注册

<service android:name=".MyService"/>

启动service(activity中)

Intent intent = new Intent(this , MyService.class); 
startService(intent);

杀死service(activity中)

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

service交互:

启动service时应该这么写

Intent intent = new Intent(this , MyService.class);
bindService(intent , connection , BIND_AUTO_CREATE);
startService(intent);

下面是service交互结果展示到页面上代码:

自定义一个方法并继承自 Binder

public class MyBinder extends Binder {
        
}

在service的onCreate中实例化

    private static final String TAG = MyService.class.getName();
  private MyBinder binder; 
    @Override
    public void onCreate() {
        super.onCreate();
        Log.v(TAG , "onCreate");
        binder = new MyBinder();
    }

实例一个变量

    private long result;

在onStartCommand中给result赋值

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.v(TAG , "onStartCommand");
       //线程 避免出现长时间白屏 影响用户体验
        new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i = 0 ; i < 100 ; i ++){
                    result+= i;
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
        //播放音乐的代码
        return super.onStartCommand(intent, flags, startId);
    }

在自定义方法中返回result

public class MyBinder extends Binder {
        public long getResult(){
            return result;
        }
    }

在onBinder方法中返回

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

在activity中

    private MyService.MyBinder binder;
 
    private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            binder = (MyService.MyBinder)service;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            binder = null;
        }
    };
获取交互结果result
binder.getResult()

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.v(TAG , "onDestroy");
        //关闭音乐的代码
    }

三、广播 BroadcastReceiver

定义一个广播实现

public class MyReceiver extends BroadcastReceiver{

}

静态注册(建议使用):在清单文件中

        <receiver android:name=".MyReceiver">
            <intent-filter>
                <action android:name="com.jiangjie.myreceiver"/>
            </intent-filter>
        </receiver>
                Intent intent = new Intent();
                intent.putExtra("result" , result);
                intent.setAction("com.jiangjie.myreceiver");
                sendBroadcast(intent);

动态注册:

    @Override
    protected void onResume() {
        super.onResume();
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        filter.addAction(Intent.ACTION_USER_PRESENT);
        registerReceiver(myReceiver , filter);
    }

    @Override
    protected void onStop() {
        super.onStop();
        unregisterReceiver(myReceiver);
    }

在广播实现里获取广播

        @Override
        public void onReceive(Context context, Intent intent) {
            //接收到广播后进行的操作

            //广播实例
            if (Intent.ACTION_SCREEN_ON.equals(intent)) {
                // 开屏
            } else if (Intent.ACTION_SCREEN_OFF.equals(intent)) {
                // 锁屏
            } else if (Intent.ACTION_USER_PRESENT.equals(intent)) {
                // 解锁
            }
        }

四、数据共享content provider

首先创建数据库

创建类 DBManager 继承自

extends SQLiteOpenHelper

实现两个方法

    @Override
    public void onCreate(SQLiteDatabase db) {
        //数据库创建
        db.execSQL(DBConstant.CREATE_TABLE_SQL);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //数据库版本变更
        db.execSQL(DBConstant.DROP_TABLE_SQL);//删除
        onCreate(db);
    }
public class DBConstant {

    public static final String DB_NAME = "my.db";
    public static final String TABLE_NAME = "users";
    public static final int DB_VERSION = 1;
    public static final String CREATE_TABLE_SQL = "CREATE TABLE " + TABLE_NAME + "(id integer primary key autoincrement , name text NOT NULL , age integer)";
    public static final String DROP_TABLE_SQL = "DROP TABLE IF EXISTS " + TABLE_NAME;
}

创建user表的model

    private int id;
    private String name;
    private int age;
创建class
UserProvider 继承自extends ContentProvider
    private SQLiteDatabase db;
    private static final String AUTHORITY = "com.xxxx.provider";//存放资源的主机名 任意
    private static final String PATH = "user";//资源自身的名称,由路径表示
    private static final int ALL = 1;
    private static final int BY_ID = 2;
    private UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

    @Override
    public boolean onCreate() {
        DBManager dbManager = new DBManager(getContext(), DBConstant.DB_NAME, null, DBConstant.DB_VERSION);
        db = dbManager.getWritableDatabase();
        uriMatcher.addURI(AUTHORITY, PATH, ALL); //countent://com.jiangjie.provider/user
        uriMatcher.addURI(AUTHORITY, PATH + "/#", BY_ID); //content://com.jiangjie.provider/user/id
        return true;
    }

    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
        int match = uriMatcher.match(uri);
        switch (match) {
            case ALL:
                return db.query(DBConstant.TABLE_NAME, projection, null, null, null, null, null);
            case BY_ID:
                long id = ContentUris.parseId(uri);
                return db.query(DBConstant.TABLE_NAME, projection, "id = " + id, null, null, null, null);
        }
        return null;
    }

    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        return null;
    }

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
        long id = db.insert(DBConstant.TABLE_NAME, null, values);
        if (id > 0) {
            return Uri.withAppendedPath(Uri.parse(AUTHORITY), PATH + "/" + id);
        }
        throw new SQLException("添加数据失败");
    }

    @Override
    public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
        int match = uriMatcher.match(uri);
        switch (match) {
            case ALL:
                return db.delete(DBConstant.TABLE_NAME, null, null);
            case BY_ID:
                long id = ContentUris.parseId(uri);
                return db.delete(DBConstant.TABLE_NAME, "id = " + id, null);
        }
        return 0;
    }

    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
        int match = uriMatcher.match(uri);
        switch (match) {
            case ALL:
                return db.update(DBConstant.TABLE_NAME, values, selection, selectionArgs);
            case BY_ID:
                long id = ContentUris.parseId(uri);
                return db.update(DBConstant.TABLE_NAME, values, "id = " + id, null);
        }
        return 0;
    }
provider的使用
        ListView lv = findViewById(R.id.ListView);
        Uri uri = Uri.parse("content://com.xxxx.provider/user");
        ContentResolver resolver = getContentResolver();
        ContentValues cv = new ContentValues();
        cv.put("name", "Luci");
        cv.put("age", 23);
        Uri newUri = resolver.insert(uri, cv);
        if (newUri != null) {
            //插入成功 以后查询
            List<User> userList = new ArrayList<>();
            Cursor cursor = resolver.query(uri, null, null, null, null, null);
            while (cursor.moveToNext()) {
                int id = cursor.getInt(0);
                String name = cursor.getString(1);
                int age = cursor.getInt(2);
                User user = new User(id, name, age);
                userList.add(user);
            }
            lv.setAdapter(new UserListAdapter(userList));
        }
   private class UserListAdapter extends BaseAdapter {

        private List<User> users;

        public UserListAdapter(List<User> users) {
            this.users = users;
        }

        @Override
        public int getCount() {
            return users.size();
        }

        @Override
        public Object getItem(int position) {
            return users.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            //cell复用
            ViewHolder vh;
            if (convertView == null) {
                convertView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.users_item_layout, parent, false);
                vh = new ViewHolder(convertView);
                convertView.setTag(vh);
            } else {
                vh = (ViewHolder) convertView.getTag();
            }
            vh.id.setText("编号:" + users.get(position).getId());
            vh.name.setText("姓名:" + users.get(position).getName());
            vh.age.setText("年龄: " + users.get(position).getAge());
            return convertView;
        }

        private class ViewHolder {
            public TextView id;
            public TextView name;
            public TextView age;

            public ViewHolder(View v) {
                id = v.findViewById(R.id.tv_id);
                name = v.findViewById(R.id.tv_name);
                age = v.findViewById(R.id.tv_age);
            }
        }
    }

user_item_layout.xml

ListView



清单文件中注册:
            <provider
            android:name=".provider.UserProvider"
            android:authorities="com.jiangjie.provider"
            android:exported="true"/>

在其他工程里可以这样使用数据

Uri uri = Uri.parse("content://com.jiangjie.provider/user");
        ContentResolver resolver = getContentResolver();
        List<User> userList = new ArrayList<>();
        Cursor cursor = resolver.query(uri, null, null, null, null, null);
while (cursor.moveToNext()) {
            int id = cursor.getInt(0);
            String name = cursor.getString(1);
            int age = cursor.getInt(2);
            User user = new User(id, name, age);
            userList.add(user);
        }


 






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值