android ContentProvider中getType(Uri uri)的理解

很多朋友在用ContentProvider的時候,對複寫的方法getType(Uri uri)不理解,也不知道這個方法是在什麼時候被調用的,今天就為大家解釋一下。

   當我們在程序中需要啟動例外的activity時,很多時候我們是使用的隱式調用,即我們不直接指定要跳轉的Activity,而是為Intent提供一些相關的參數,讓其自動的去和AndroidManifest.xml中已有的Activity去匹配,而IntentFilter(Intent 過濾器)在xml中有三個主要的參數:action,categary,data。

我們通過Intent的構造函數或者Intent提供的方法可以指定這三個參數,如方法有:

‍            intent.setAction(action);
            intent.setData(data);
            intent.addCategory(category);

等,比如在記事本程序中有:

‍         <intent-filter android:label="@string/resolve_edit">
                <action android:name="android.intent.action.VIEW" />
                <action android:name="android.intent.action.EDIT" />
                <action android:name="com.android.notepad.action.EDIT_NOTE" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
            </intent-filter>

我們很容易看出action和category是很容易匹配的,而我們傳的Uri的數據怎麼匹配呢,這時系統就會去調用你定義的ContentProvider中的getType,取得相關的返回值來和上面的data串進行匹配,當然getType的返回結果你是需要自己去定義的。

但在程序中你也可以自己知道data的類型,就直接匹配了:intent.setType(type);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ContentProviderAndroid 的一种组件,它提供了一个标准的接口,允许应用程序在不同的进程之间共享数据。下面是一个简单的 ContentProvider 示例,用于提供用户信息: 1. 创建一个 User 类,代表用户信息: ```java public class User { private String name; private int age; public User(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } } ``` 2. 创建一个 UserProvider 类,继承自 ContentProvider,并实现必要的方法: ```java public class UserProvider extends ContentProvider { private static final String AUTHORITY = "com.example.userprovider"; private static final String BASE_PATH = "users"; public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + BASE_PATH); private List<User> users; @Override public boolean onCreate() { users = new ArrayList<>(); users.add(new User("Alice", 25)); users.add(new User("Bob", 30)); return true; } @Nullable @Override public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) { MatrixCursor cursor = new MatrixCursor(new String[]{"_id", "name", "age"}); int id = 0; for (User user : users) { cursor.addRow(new Object[]{id++, user.getName(), user.getAge()}); } return cursor; } @Nullable @Override public String getType(@NonNull Uri uri) { return "vnd.android.cursor.dir/vnd.example.users"; } @Nullable @Override public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) { String name = values.getAsString("name"); int age = values.getAsInteger("age"); users.add(new User(name, age)); return CONTENT_URI; } @Override public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) { users.clear(); return 0; } @Override public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) { String name = values.getAsString("name"); int age = values.getAsInteger("age"); users.clear(); users.add(new User(name, age)); return 1; } @Override public int bulkInsert(@NonNull Uri uri, @NonNull ContentValues[] values) { for (ContentValues value : values) { String name = value.getAsString("name"); int age = value.getAsInteger("age"); users.add(new User(name, age)); } return values.length; } } ``` 3. 在 AndroidManifest.xml 声明 ContentProvider: ```xml <provider android:name=".UserProvider" android:authorities="com.example.userprovider" android:exported="true"/> ``` 4. 在应用程序使用 ContentProvider: ```java ContentResolver resolver = getContentResolver(); Uri uri = UserProvider.CONTENT_URI; // 查询所有用户信息 Cursor cursor = resolver.query(uri, null, null, null, null); while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex("name")); int age = cursor.getInt(cursor.getColumnIndex("age")); Log.d(TAG, "name: " + name + ", age: " + age); } // 插入一个新用户 ContentValues values = new ContentValues(); values.put("name", "Charlie"); values.put("age", 35); resolver.insert(uri, values); // 更新第一个用户信息 ContentValues updateValues = new ContentValues(); updateValues.put("name", "Alice"); updateValues.put("age", 26); resolver.update(ContentUris.withAppendedId(uri, 0), updateValues, null, null); ``` 以上就是一个简单的 ContentProvider 示例。通过 ContentProvider,我们可以在不同的应用程序共享数据,从而提高应用程序之间的互操作性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值