当前位置: 编程技术>移动开发
本页文章导读:
▪开机自启动三 开机自启动3
一个例子xml: 代码<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission><receiver android:name=".OlympicsReceiver" android:label="@string/app_name"> <intent-.........
▪ 关于联系人的批改[目前只是这几个想法],基于2.1 关于联系人的修改[目前只是这几个想法],基于2.1
看了一些Android开源小应用的写法,感觉好像代码都比较乱,各种各样的都有虽然自己写的代码也很糟糕,但还是能感觉到在Android开发方.........
▪ getSharedPreferences(String name, int mode) of Service的兑现(转) getSharedPreferences(String name, int mode) of Service的实现(转)
I found a method getSharedPreferences(String name, int mode) in Service classthan I want to see how it implementsfirst I got a abstrat method in Context class/android_opensou.........
[1]开机自启动三
来源: 互联网 发布时间: 2014-02-18
开机自启动3
一个例子
xml:
代码
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
<receiver android:name=".OlympicsReceiver" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</receiver>
java:
代码
public class OlympicsReceiver extends IntentReceiver
{
/*要接收的intent源*/
static final String ACTION = "android.intent.action.BOOT_COMPLETED";
public void onReceiveIntent(Context context, Intent intent)
{
if (intent.getAction().equals(ACTION))
{
context.startService(new Intent(context,
OlympicsService.class), null);//启动倒计时服务
Toast.makeText(context, "OlympicsReminder service has started!", Toast.LENGTH_LONG).show();
}
}
}
注意:现在的IntentReceiver已经变为BroadcastReceiver,OnReceiveIntent为onReceive。所以java这边的代码为:
(也可以实现应用程序开机自动启动)
Code
public class OlympicsReceiver extends BroadcastReceiver
{
/*要接收的intent源*/
static final String ACTION = "android.intent.action.BOOT_COMPLETED";
public void onReceive(Context context, Intent intent)
{
if (intent.getAction().equals(ACTION))
{
context.startService(new Intent(context,
OlympicsService.class), null);//启动倒计时服务
Toast.makeText(context, "OlympicsReminder service has started!", Toast.LENGTH_LONG).show();
//这边可以添加开机自动启动的应用程序代码
}
}
}
一个例子
xml:
代码
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
<receiver android:name=".OlympicsReceiver" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</receiver>
java:
代码
public class OlympicsReceiver extends IntentReceiver
{
/*要接收的intent源*/
static final String ACTION = "android.intent.action.BOOT_COMPLETED";
public void onReceiveIntent(Context context, Intent intent)
{
if (intent.getAction().equals(ACTION))
{
context.startService(new Intent(context,
OlympicsService.class), null);//启动倒计时服务
Toast.makeText(context, "OlympicsReminder service has started!", Toast.LENGTH_LONG).show();
}
}
}
注意:现在的IntentReceiver已经变为BroadcastReceiver,OnReceiveIntent为onReceive。所以java这边的代码为:
(也可以实现应用程序开机自动启动)
Code
public class OlympicsReceiver extends BroadcastReceiver
{
/*要接收的intent源*/
static final String ACTION = "android.intent.action.BOOT_COMPLETED";
public void onReceive(Context context, Intent intent)
{
if (intent.getAction().equals(ACTION))
{
context.startService(new Intent(context,
OlympicsService.class), null);//启动倒计时服务
Toast.makeText(context, "OlympicsReminder service has started!", Toast.LENGTH_LONG).show();
//这边可以添加开机自动启动的应用程序代码
}
}
}
[2] 关于联系人的批改[目前只是这几个想法],基于2.1
来源: 互联网 发布时间: 2014-02-18
关于联系人的修改[目前只是这几个想法],基于2.1
看了一些Android开源小应用的写法,感觉好像代码都比较乱,各种各样的都有
虽然自己写的代码也很糟糕,但还是能感觉到在Android开发方面的代码比JEE的要乱很多
着重点不一样吧
联系人修改
1、根据已有的数据,特别是id,查询出要修改哪几条数据,然后一条条去修改
这是一种方法,但我目前没有采取这种方法,因为服务器端返回的数据中只包含了一些数据,没有很多像主键这样的东西,所以我采取了另外一种写法
2、删除data表中有关的数据,然后再新增,这是我目前采用的方法,raw_contacts表和contacts表数据不删除,只是修改
基本代码类似下面
备注:这样修改还是有问题的,貌似contacts会生成新的记录,这样对于需要contact_id的情况就是悲剧啊
下面删除联系人的代码也还是有问题的
看了一些Android开源小应用的写法,感觉好像代码都比较乱,各种各样的都有
虽然自己写的代码也很糟糕,但还是能感觉到在Android开发方面的代码比JEE的要乱很多
着重点不一样吧
联系人修改
1、根据已有的数据,特别是id,查询出要修改哪几条数据,然后一条条去修改
这是一种方法,但我目前没有采取这种方法,因为服务器端返回的数据中只包含了一些数据,没有很多像主键这样的东西,所以我采取了另外一种写法
2、删除data表中有关的数据,然后再新增,这是我目前采用的方法,raw_contacts表和contacts表数据不删除,只是修改
基本代码类似下面
// 已知一个ID了,要修改他下面的数据
// 删除他下面的DATA数据,然后再新增数据
long id = 3l;
// 根据id查询出rawid
// 可能有多个rawid
Cursor cursor = rawContactsCursor(getApplicationContext(), id);
while (cursor.moveToNext()) {
long rawid = cursor.getLong(cursor
.getColumnIndex(RawContacts._ID));
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation
.newDelete(Data.CONTENT_URI).withSelection(
Data.RAW_CONTACT_ID + "=?",
new String[] { String.valueOf(rawid) })
.build());
ops.add(ContentProviderOperation
.newInsert(Data.CONTENT_URI).withValue(
Data.RAW_CONTACT_ID, rawid).withValues(
getNameNewCV()).build());
ops.add(ContentProviderOperation
.newInsert(Data.CONTENT_URI).withValue(
Data.RAW_CONTACT_ID, rawid).withValues(
getPhoneNewCV()).build());
try {
ContentProviderResult[] rst = getContentResolver()
.applyBatch(ContactsContract.AUTHORITY, ops);
} catch (RemoteException e) {
e.printStackTrace();
} catch (OperationApplicationException e) {
e.printStackTrace();
}
} private Cursor rawContactsCursor(Context ctx, long id) {
return ctx.getContentResolver().query(
ContactsContract.RawContacts.CONTENT_URI, null,
ContactsContract.RawContacts.CONTACT_ID + "=?",
new String[] { String.valueOf(id) }, null);
} public ContentValues getNameNewCV() {
ContentValues cv = new ContentValues();
cv.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
cv.put(StructuredName.DISPLAY_NAME, "武 体");
cv.put(StructuredName.GIVEN_NAME, "体");
cv.put(StructuredName.FAMILY_NAME, "武");
return cv;
} public ContentValues getPhoneNewCV() {
ContentValues cv = new ContentValues();
cv.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
cv.put(Phone.NUMBER, "666666");
cv.put(Phone.TYPE, Phone.TYPE_COMPANY_MAIN);
return cv;
}备注:这样修改还是有问题的,貌似contacts会生成新的记录,这样对于需要contact_id的情况就是悲剧啊
下面删除联系人的代码也还是有问题的
// 删除联系人
// 删除Data
long id = 1l;
// 根据id查询出rawid
// 可能有多个rawid
Cursor cursor = rawContactsCursor(getApplicationContext(), id);
ArrayList<ContentProviderOperation> ops = null;
while (cursor.moveToNext()) {
long rawid = cursor.getLong(cursor
.getColumnIndex(RawContacts._ID));
ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation
.newDelete(Data.CONTENT_URI).withSelection(
Data.RAW_CONTACT_ID + "=?",
new String[] { String.valueOf(rawid) })
.build());
ops.add(ContentProviderOperation.newDelete(
ContentUris.withAppendedId(RawContacts.CONTENT_URI,
rawid)).build());
ops.add(ContentProviderOperation.newDelete(
ContentUris
.withAppendedId(Contacts.CONTENT_URI, id))
.build());
try {
ContentProviderResult[] rst = getContentResolver()
.applyBatch(ContactsContract.AUTHORITY, ops);
} catch (RemoteException e) {
e.printStackTrace();
} catch (OperationApplicationException e) {
e.printStackTrace();
}
}
[3] getSharedPreferences(String name, int mode) of Service的兑现(转)
来源: 互联网 发布时间: 2014-02-18
getSharedPreferences(String name, int mode) of Service的实现(转)
I found a method getSharedPreferences(String name, int mode) in Service class
than I want to see how it implements
first I got a abstrat method in Context class
/android_opensource/frameworks/base/core/java/android/content/Context.java
and Service extends ContextWrapper, ContextWrapper extends Context just implements from a new Context instance
/android_opensource/frameworks/base/core/java/android/content/ContextWrapper.java
so where does it pass the Context instance to the Service
The Context instance must implements the method
than I found the implementation in ApplicationContext which extends the Context
android_opensource/frameworks/base/core/java/android/app/ApplicationContext.java
but I still did't found where it pass the ApplicationContext in
after few minutes search I found another class ActivityThread
It had a method handleCreateService which should be called when create a Service
android_opensource/frameworks/base/core/java/android/app/ActivityThread.java
In the method it call the service's method attch and pass a ApplicationContext as parameter
then The service's attch method would pass the context throght the attachBaseContext(context) method
android_opensource/frameworks/base/core/java/android/app/Service.java
android_opensource/frameworks/base/core/java/android/content/ContextWrapper.java
so the service get the Context instance which implement the getSharedPreferences(String name, int mode) method
the original url http://hi.baidu.com/ksoftware/blog/item/de17bbd6806b202507088bd8.html
I found a method getSharedPreferences(String name, int mode) in Service class
than I want to see how it implements
first I got a abstrat method in Context class
/android_opensource/frameworks/base/core/java/android/content/Context.java
...
262 /**
263 * Retrieve and hold the contents of the preferences file 'name', returning
264 * a SharedPreferences through which you can retrieve and modify its
265 * values. Only one instance of the SharedPreferences object is returned
266 * to any callers for the same name, meaning they will see each other's
267 * edits as soon as they are made.
268 *
269 * @param name Desired preferences file. If a preferences file by this name
270 * does not exist, it will be created when you retrieve an
271 * editor (SharedPreferences.edit()) and then commit changes (Editor.commit()).
272 * @param mode Operating mode. Use 0 or {@link #MODE_PRIVATE} for the
273 * default operation, {@link #MODE_WORLD_READABLE}
274 * and {@link #MODE_WORLD_WRITEABLE} to control permissions.
275 *
276 * @return Returns the single SharedPreferences instance that can be used
277 * to retrieve and modify the preference values.
278 *
279 * @see #MODE_PRIVATE
280 * @see #MODE_WORLD_READABLE
281 * @see #MODE_WORLD_WRITEABLE
282 */
283 public abstract SharedPreferences getSharedPreferences(String name,
284 int mode);
...and Service extends ContextWrapper, ContextWrapper extends Context just implements from a new Context instance
/android_opensource/frameworks/base/core/java/android/content/ContextWrapper.java
...
132 @Override
133 public SharedPreferences getSharedPreferences(String name, int mode) {
134 return mBase.getSharedPreferences(name, mode);
135 }
...so where does it pass the Context instance to the Service
The Context instance must implements the method
than I found the implementation in ApplicationContext which extends the Context
android_opensource/frameworks/base/core/java/android/app/ApplicationContext.java
...
@Override
303 public SharedPreferences getSharedPreferences(String name, int mode) {
304 SharedPreferencesImpl sp;
305 File f = makeFilename(getPreferencesDir(), name + ".xml");
306 synchronized (sSharedPrefs) {
307 sp = sSharedPrefs.get(f);
308 if (sp != null && !sp.hasFileChanged()) {
309 //Log.i(TAG, "Returning existing prefs " + name + ": " + sp);
310 return sp;
311 }
312 }
313
314 FileInputStream str = null;
315 File backup = makeBackupFile(f);
316 if (backup.exists()) {
317 f.delete();
318 backup.renameTo(f);
319 }
320
321 // Debugging
322 if (f.exists() && !f.canRead()) {
323 Log.w(TAG, "Attempt to read preferences file " + f + " without permission");
324 }
325
326 Map map = null;
327 if (f.exists() && f.canRead()) {
328 try {
329 str = new FileInputStream(f);
330 map = XmlUtils.readMapXml(str);
331 str.close();
332 } catch (org.xmlpull.v1.XmlPullParserException e) {
333 Log.w(TAG, "getSharedPreferences", e);
334 } catch (FileNotFoundException e) {
335 Log.w(TAG, "getSharedPreferences", e);
336 } catch (IOException e) {
337 Log.w(TAG, "getSharedPreferences", e);
338 }
339 }
340
341 synchronized (sSharedPrefs) {
342 if (sp != null) {
343 //Log.i(TAG, "Updating existing prefs " + name + " " + sp + ": " + map);
344 sp.replace(map);
345 } else {
346 sp = sSharedPrefs.get(f);
347 if (sp == null) {
348 sp = new SharedPreferencesImpl(f, mode, map);
349 sSharedPrefs.put(f, sp);
350 }
351 }
352 return sp;
353 }
354 }
...but I still did't found where it pass the ApplicationContext in
after few minutes search I found another class ActivityThread
It had a method handleCreateService which should be called when create a Service
android_opensource/frameworks/base/core/java/android/app/ActivityThread.java
...
2436 private final void handleCreateService(CreateServiceData data) {
2437 // If we are getting ready to gc after going to the background, well
2438 // we are back active so skip it.
2439 unscheduleGcIdler();
2440
2441 PackageInfo packageInfo = getPackageInfoNoCheck(
2442 data.info.applicationInfo);
2443 Service service = null;
2444 try {
2445 java.lang.ClassLoader cl = packageInfo.getClassLoader();
2446 service = (Service) cl.loadClass(data.info.name).newInstance();
2447 } catch (Exception e) {
2448 if (!mInstrumentation.onException(service, e)) {
2449 throw new RuntimeException(
2450 "Unable to instantiate service " + data.info.name
2451 + ": " + e.toString(), e);
2452 }
2453 }
2454
2455 try {
2456 if (localLOGV) Log.v(TAG, "Creating service " + data.info.name);
2457
2458 ApplicationContext context = new ApplicationContext();
2459 context.init(packageInfo, null, this);
2460
2461 Application app = packageInfo.makeApplication();
2462 context.setOuterContext(service);
2463 service.attach(context, this, data.info.name, data.token, app,
2464 ActivityManagerNative.getDefault());
2465 service.onCreate();
2466 mServices.put(data.token, service);
2467 try {
2468 ActivityManagerNative.getDefault().serviceDoneExecuting(data.token);
2469 } catch (RemoteException e) {
2470 // nothing to do.
2471 }
2472 } catch (Exception e) {
2473 if (!mInstrumentation.onException(service, e)) {
2474 throw new RuntimeException(
2475 "Unable to create service " + data.info.name
2476 + ": " + e.toString(), e);
2477 }
2478 }
2479 }
...In the method it call the service's method attch and pass a ApplicationContext as parameter
then The service's attch method would pass the context throght the attachBaseContext(context) method
android_opensource/frameworks/base/core/java/android/app/Service.java
...
356 public final void attach(
357 Context context,
358 ActivityThread thread, String className, IBinder token,
359 Application application, Object activityManager) {
360 attachBaseContext(context);
361 mThread = thread; // NOTE: unused - remove?
362 mClassName = className;
363 mToken = token;
364 mApplication = application;
365 mActivityManager = (IActivityManager)activityManager;
366 }
...android_opensource/frameworks/base/core/java/android/content/ContextWrapper.java
...
50 /**
51 * Set the base context for this ContextWrapper. All calls will then be
52 * delegated to the base context. Throws
53 * IllegalStateException if a base context has already been set.
54 *
55 * @param base The new base context for this wrapper.
56 */
57 protected void attachBaseContext(Context base) {
58 if (mBase != null) {
59 throw new IllegalStateException("Base context already set");
60 }
61 mBase = base;
62 }
...so the service get the Context instance which implement the getSharedPreferences(String name, int mode) method
the original url http://hi.baidu.com/ksoftware/blog/item/de17bbd6806b202507088bd8.html
最新技术文章: