service.cpp里有对intent的处理
188 } else if (strcmp(argv[optind], "intent") == 0) { 189 190 char* action = NULL; 191 char* dataArg = NULL; 192 char* type = NULL; 193 int launchFlags = 0; 194 char* component = NULL; 195 int categoryCount = 0; 196 char* categories[16]; 197 198 char* context1 = NULL; 199 200 optind++; 201 202 while (optind < argc) 203 { 204 char* key = strtok_r(argv[optind], "=", &context1); 205 char* value = strtok_r(NULL, "=", &context1); 206 207 // we have reached the end of the XXX=XXX args. 208 if (key == NULL) break; 209 210 if (strcmp(key, "action") == 0) 211 { 212 action = value; 213 } 214 else if (strcmp(key, "data") == 0) 215 { 216 dataArg = value; 217 } 218 else if (strcmp(key, "type") == 0) 219 { 220 type = value; 221 } 222 else if (strcmp(key, "launchFlags") == 0) 223 { 224 launchFlags = atoi(value); 225 } 226 else if (strcmp(key, "component") == 0) 227 { 228 component = value; 229 } 230 else if (strcmp(key, "categories") == 0) 231 { 232 char* context2 = NULL; 233 int categoryCount = 0; 234 categories[categoryCount] = strtok_r(value, ",", &context2); 235 236 while (categories[categoryCount] != NULL) 237 { 238 categoryCount++; 239 categories[categoryCount] = strtok_r(NULL, ",", &context2); 240 } 241 } 242 243 optind++; 244 } 245 246 writeString16(data, action); 247 writeString16(data, dataArg); 248 writeString16(data, type); 249 data.writeInt32(launchFlags); 250 writeString16(data, component); 251 252 if (categoryCount > 0) 253 { 254 data.writeInt32(categoryCount); 255 for (int i = 0 ; i < categoryCount ; i++) 256 { 257 writeString16(data, categories[i]); 258 } 259 } 260 else 261 { 262 data.writeInt32(0); 263 } 264 265 // for now just set the extra field to be null. 266 data.writeInt32(-1); 267 } else { 268 aerr << "service: unknown option " << argv[optind] << endl; 269 wantsUsage = true; 270 result = 10; 271 break; 272 }
我们尝试进行调用,
准备使用service call 使用如下调用功能
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
getPackageManager().queryIntentActivities(mainIntent, 0);
$ service call package 42 intent action=android.intent.action.MAIN cat
egories=android.intent.category.LAUNCHER i32 0 i32 0
Result: Parcel(
0x00000000: fffffffd 00000019 006e0055 006e006b '........U.n.k.n.'
0x00000010: 0077006f 0020006e 00520055 00200049 'o.w.n. .U.R.I. .'
0x00000020: 00790074 00650070 0020003a 00340037 't.y.p.e.:. .7.4.'
0x00000030: 00310037 00300032 00000034 '7.1.2.0.4... ')
log
01-09 02:52:17.500 1075-1980/? W/System.err: java.lang.IllegalArgumentException: Unknown URI type: 7471204
01-09 02:52:17.501 1075-1980/? W/System.err: at android.net.Uri$1.createFromParcel(Uri.java:1779)
01-09 02:52:17.501 1075-1980/? W/System.err: at android.net.Uri$1.createFromParcel(Uri.java:1769)
01-09 02:52:17.501 1075-1980/? W/System.err: at android.content.Intent.readFromParcel(Intent.java:8680)
01-09 02:52:17.501 1075-1980/? W/System.err: at android.content.Intent.<init>(Intent.java:8675)
01-09 02:52:17.501 1075-1980/? W/System.err: at android.content.Intent$1.createFromParcel(Intent.java:8666)
01-09 02:52:17.501 1075-1980/? W/System.err: at android.content.Intent$1.createFromParcel(Intent.java:8665)
01-09 02:52:17.501 1075-1980/? W/System.err: at android.content.pm.IPackageManager$Stub.onTransact(IPackageManager.java:662)
01-09 02:52:17.501 1075-1980/? W/System.err: at com.android.server.pm.PackageManagerService.onTransact(PackageManagerService.java:3732)
01-09 02:52:17.501 1075-1980/? W/System.err: at android.os.Binder.execTransact(Binder.java:577)
查看
Intent.java
public static final Parcelable.Creator<Intent> CREATOR
= new Parcelable.Creator<Intent>() {
public Intent createFromParcel(Parcel in) {
return new Intent(in);
}
public Intent[] newArray(int size) {
return new Intent[size];
}
};
/** @hide */
protected Intent(Parcel in) {
readFromParcel(in);
}
public void readFromParcel(Parcel in) {
setAction(in.readString());
mData = Uri.CREATOR.createFromParcel(in);
mType = in.readString();
mFlags = in.readInt();
mPackage = in.readString();
mComponent = ComponentName.readFromParcel(in);
if (in.readInt() != 0) {
mSourceBounds = Rect.CREATOR.createFromParcel(in);
}
int N = in.readInt();
if (N > 0) {
mCategories = new ArraySet<String>();
int i;
for (i=0; i<N; i++) {
mCategories.add(in.readString().intern());
}
} else {
mCategories = null;
}
if (in.readInt() != 0) {
mSelector = new Intent(in);
}
if (in.readInt() != 0) {
mClipData = new ClipData(in);
}
mContentUserHint = in.readInt();
mExtras = in.readBundle();
}
Uri.java
public static final Parcelable.Creator<Uri> CREATOR
= new Parcelable.Creator<Uri>() {
public Uri createFromParcel(Parcel in) {
int type = in.readInt();
switch (type) {
case NULL_TYPE_ID: return null;
case StringUri.TYPE_ID: return StringUri.readFrom(in);
case OpaqueUri.TYPE_ID: return OpaqueUri.readFrom(in);
case HierarchicalUri.TYPE_ID:
return HierarchicalUri.readFrom(in);
}
throw new IllegalArgumentException("Unknown URI type: " + type);
}
public Uri[] newArray(int size) {
return new Uri[size];
}
};
service.cpp里写parcel数据没有按照intent标准去写导致的问题,
我们按照intent的格式去写数据就可以。但是这样的调用还是显得比较繁琐,没有直接在应用层调用方便。
附,IPackageManager.java里的处理 @Override public android.content.pm.ParceledListSlice queryIntentActivities(android.content.Intent intent, java.lang.String resolvedType, int flags, int userId) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
android.content.pm.ParceledListSlice _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
if ((intent!=null)) {
_data.writeInt(1);
intent.writeToParcel(_data, 0);
}
else {
_data.writeInt(0);
}
_data.writeString(resolvedType);
_data.writeInt(flags);
_data.writeInt(userId);
mRemote.transact(Stub.TRANSACTION_queryIntentActivities, _data, _reply, 0);
_reply.readException();
if ((0!=_reply.readInt())) {
_result = android.content.pm.ParceledListSlice.CREATOR.createFromParcel(_reply);
}
else {
_result = null;
}
}
finally {
_reply.recycle();
_data.recycle();
}
return _result;
}
static final int TRANSACTION_queryIntentActivities = (android.os.IBinder.FIRST_CALL_TRANSACTION + 41);
case TRANSACTION_queryIntentActivities:
{
data.enforceInterface(DESCRIPTOR);
android.content.Intent _arg0;
if ((0!=data.readInt())) {
_arg0 = android.content.Intent.CREATOR.createFromParcel(data);
}
else {
_arg0 = null;
}
java.lang.String _arg1;
_arg1 = data.readString();
int _arg2;
_arg2 = data.readInt();
int _arg3;
_arg3 = data.readInt();
android.content.pm.ParceledListSlice _result = this.queryIntentActivities(_arg0, _arg1, _arg2, _arg3);
reply.writeNoException();
if ((_result!=null)) {
reply.writeInt(1);
_result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
}
else {
reply.writeInt(0);
}
return true;
}
获取intent数据出错
_arg0 = android.content.Intent.CREATOR.createFromParcel(data);
@Override public android.content.pm.ParceledListSlice queryIntentActivities(android.content.Intent intent, java.lang.String resolvedType, int flags, int userId) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
android.content.pm.ParceledListSlice _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
if ((intent!=null)) {
_data.writeInt(1);
intent.writeToParcel(_data, 0);
}
else {
_data.writeInt(0);
}
_data.writeString(resolvedType);
_data.writeInt(flags);
_data.writeInt(userId);
mRemote.transact(Stub.TRANSACTION_queryIntentActivities, _data, _reply, 0);
_reply.readException();
if ((0!=_reply.readInt())) {
_result = android.content.pm.ParceledListSlice.CREATOR.createFromParcel(_reply);
}
else {
_result = null;
}
}
finally {
_reply.recycle();
_data.recycle();
}
return _result;
}
static final int TRANSACTION_queryIntentActivities = (android.os.IBinder.FIRST_CALL_TRANSACTION + 41);
case TRANSACTION_queryIntentActivities:
{
data.enforceInterface(DESCRIPTOR);
android.content.Intent _arg0;
if ((0!=data.readInt())) {
_arg0 = android.content.Intent.CREATOR.createFromParcel(data);
}
else {
_arg0 = null;
}
java.lang.String _arg1;
_arg1 = data.readString();
int _arg2;
_arg2 = data.readInt();
int _arg3;
_arg3 = data.readInt();
android.content.pm.ParceledListSlice _result = this.queryIntentActivities(_arg0, _arg1, _arg2, _arg3);
reply.writeNoException();
if ((_result!=null)) {
reply.writeInt(1);
_result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
}
else {
reply.writeInt(0);
}
return true;
}
获取intent数据出错
_arg0 = android.content.Intent.CREATOR.createFromParcel(data);