一、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);
}