搜档网
当前位置:搜档网 › android跨进程访问

android跨进程访问

android跨进程访问
android跨进程访问

由于android系统中应用程序之间不能共享内存。因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些。在android SDK中提供了4种用于跨进程通讯的方式。这4种方式正好对应于android系统中4种应用程序组件:Activity、Content Provider、Broadcast 和Service。其中Activity可以跨进程调用其他应用程序的Activity;Content Provider可以跨进程访问其他应用程序中的数据(以Cursor对象形式返回),当然,也可以对其他应用程序的数据进行增、删、改操作;Broadcast可以向android系统中所有应用程序发送广播,而需要跨进程通讯的应用程序可以监听这些广播;Service和Content Provider类似,也可以访问其他应用程序中的数据,但不同的是,Content Provider返回的是Cursor对象,而Service返回的是Java对象,这种可以跨进程通讯的服务叫AIDL服务。

完整示例请参阅本文提供的源代码。

方式一:访问其他应用程序的Activity

Activity既可以在进程内(同一个应用程序)访问,也可以跨进程访问。如果想在同一个应用程序中访问Activity,需要指定Context对象和Activity的Class对象,代码如下:

1.Intent intent = new Intent(this , Test.class );

2.startActivity(intent);

Activity的跨进程访问与进程内访问略有不同。虽然它们都需要Intent对象,但跨进程访问并不需要指定Context对象和Activity的Class对象,而需要指定的是要访问的Activity 所对应的Action(一个字符串)。有些Activity还需要指定一个Uri(通过Intent构造方法的第2个参数指定)。

在android系统中有很多应用程序提供了可以跨进程访问的Activity,例如,下面的代码可以直接调用拨打电话的Activity。

1.Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:1234567

8" );

2.startActivity(callIntent);

执行上面的代码后,系统会自动拨号,界面如图1所示。

在调用拨号程序的代码中使用了一个Intent.ACTION_CALL常量,该常量的定义如下:

1.public static final String ACTION_CALL = "android.intent.action.CALL" ;

这个常量是一个字符串常量,也是我们在这节要介绍的跨进程调用Activity的关键。如果在应用程序中要共享某个Activity,需要为这个Activity指定一个字符串ID,也就是Action。也可以将这个Action看做这个Activity的key。在其他的应用程序中只要通过这个Action就可以找到与Action对应的Activity,并通过startActivity方法来启动这个Activity。

下面先来看一下如何将应用程序的Activity共享出来,读者可按如下几步来共享Activity:

1. 在AndroidManifest.xml文件中指定Action。指定Action要使用标签,并在该标签的android:name属性中指定Action

2. 在AndroidManifest.xml文件中指定访问协议。在指定Uri(Intent类的第2个参数)时需要访问协议。访问协议需要使用标签的android:scheme属性来指定。如果该属性的值是“abc”,那么Uri就应该是“abc://Uri的主体部分”,也就是说,访问协议是Uri的开头部分。

3. 通过getIntent().getData().getHost()方法获得协议后的Uri的主体部分。这个Host只是个称谓,并不一定是主机名。读者可以将其看成是任意的字符串。

4. 从Bundle对象中获得其他应用程序传递过来的数据。

5. 这一步当然是获得数据后做进一步的处理了。至于如何处理这些数据,就得根据具体的需求决定了。

下面来根据这些步骤共享一个Activity。首先建立一个android工程(ActionActivity),工程的主Activity是Main。在本例中我们会共享这个Main类。首先打开AndroidManifest.xml 文件,添加一个标签,并重新定义了Main的相应属性。AndroidManifest.xml文件的内容如下:

1.

2.

3.

4.

5.

6.

7.

8.

在配置AndroidManifest.xml时要注意,不能在同一个中配置多个动作,否则会覆盖MAIN动作以使该程序无法正常启动(虽然其他应用程序调用Main是正常的)。

从上面的代码可以看出,标签的android:name属性值是

net.blogjava.mobile.MYACTION,这就是Main自定义的动作。标签指定了Url的协议。如果指定了标签的android:scheme属性值(info),则在调用Main时需要使用如下的URL:

https://www.sodocs.net/doc/e212525105.html,://任意字符串

一般标签的android:name属性值可以设成

android.intent.category.DEFAULT。

下面来看看如何在Main类的onCreate方法中获得其他应用程序传递过来的数据。

1.package net.blogjava.mobile.actionactivity;

2.... ...

3.public class Main extends Activity implements OnClickListener

4.{

5.private EditText editText;

6.@Override

7.public void onClick(View view)

8. {

9.// 单击按钮,会显示文本框中的内容(以Toast信息框形式显示)

10. Toast.makeText(this , editText.getText().toString(), Toast.LENGTH_

LONG)

11. .show();

12. }

13.@Override

14.public void onCreate(Bundle savedInstanceState)

15. {

16.super .onCreate(savedInstanceState);

17. setContentView(https://www.sodocs.net/doc/e212525105.html,yout.main);

18. Button button = (Button) findViewById(R.id.button);

19. button.setOnClickListener(this );

20. editText = (EditText) findViewById(R.id.edittext);

21.// 获得其他应用程序传递过来的数据

22.if (getIntent().getData() != null )

23. {

24.// 获得Host,也就是info://后面的内容

25. String host = getIntent().getData().getHost();

26. Bundle bundle = getIntent().getExtras();

27.// 其他的应用程序会传递过来一个value值,在该应用程序中需要获得这个

28. String value = bundle.getString("value" );

29.// 将Host和Value组合在一下显示在EditText组件中

30. editText.setText(host + ":" + value);

31.// 调用了按钮的单击事件,显示Toast信息提示框

32. onClick(button);

33. }

34. }

35.}

从上面的程序可以看出,首先通过getIntent().getData()来判断其他的应用程序是否传递了Uri(getData方法返回了一个Uri 对象)。如果运行该程序,Uri为null,因此,不会执行if语句里面的代码。当其他的应用程序传递了Uri对象后,系统会执行if语句里面的代码。当运行ActionActivity后,在文本框中输入“Running”,单击“显示文本框的内容”按钮,会显示如图2所示的Toast提示信息框。

下面来看一下其他的应用程序是如何调用ActionActivity中的Main。新建一个android工程(InvokeActivity),并添加一个按钮,按钮的单击事件方法代码如下:

1.public void onClick(View view)

2.{

3.// 需要使用Intent类的第2个参数指定Uri

4. Intent intent = new Intent("net.blogjava.mobile.MYACTION" , Uri

5. .parse("info://调用其他应用程序的Activity" ));

6.// 设置value属性值

7. intent.putExtra("value" , "调用成功" );

8.// 调用ActionActivity中的Main

9. startActivity(intent);

10.}

在运行InvokeActivity之前,先要运行ActionActivity以便在android模拟器中安装该程序。然后单击InvokeActivity中的按钮,就会显示如图3所示的效果。

当然,也可以使用startActivityForResult方法来启动其他应用程序的Activity,以便获得Activity的返回值。例如,可以将ActionActivity中Main类的onClick代码修改为下面的形式。

1.public void onClick(View view)

2.{

3. Toast.makeText(this , editText.getText().toString(), Toast.LENGTH_LONG

).show();

4. Intent intent = new Intent();

5.// 设置要返回的属性值

6. intent.putExtra("result" , editText.getText().toString());

7.// 设置返回码和Intent对象

8. setResult(2 , intent);

9.// 关闭Activity

10. finish();

11.}

然后在InvokeActivity中使用下面的代码来调用Main。

1.intent = new Intent("net.blogjava.mobile.MYACTION" , Uri

2. .parse("info://调用其他应用程序的Activity" ));

3.// 传递数据

4.intent.putExtra("value" , "调用成功" );

5.startActivityForResult(intent, 1 ); // 1为请求码

要想接收Activity返回的值,需要覆盖onActivityResult事件方法,代码如下:

1.@Override

2.protected void onActivityResult(int requestCode, int resultCode, Inten

t data)

3.{

4. Toast.makeText(this , "返回值:

" + data.getExtras().getString("result" ),

5. Toast.LENGTH_LONG).show();

6.}

当单击InvokeActivity中的相应按钮后,并且Main关闭后,会显示如图4所示的Toast 信息提示框。

从本节的介绍可以看出,跨进程访问Activity(访问其他应用程序中的Activity)主要是通过一个Action来完成的,如果要传递数据,还需要指定一个Uri。当然,传递数据也可以通过Intent来完成。传递数据的过程可以是双向的。如果要想从调用的Activity中返回数据,就需要使用startActivityForResult方法来启动Activity了。

方式二:Content Provider

Android应用程序可以使用文件或SqlLite数据库来存储数据。Content Provider提供了一种在多个应用程序之间数据共享的方式(跨进程共享数据)。应用程序可以利用Content Provider完成下面的工作

1. 查询数据

2. 修改数据

3. 添加数据

4. 删除数据

虽然Content Provider也可以在同一个应用程序中被访问,但这么做并没有什么意义。Content Provider存在的目的向其他应用程序共享数据和允许其他应用程序对数据进行增、删、改操作。

Android系统本身提供了很多Content Provider,例如,音频、视频、联系人信息等等。我们可以通过这些Content Provider获得相关信息的列表。这些列表数据将以Cursor对象返回。因此,从Content Provider返回的数据是二维表的形式。

对于访问Content Provider的程序,需要使用ContentResolver对象。该对象需要使用getContentResolver方法获得,代码如下:

1.ContentResolver cr = getContentResolver();

与Activity一样,Content Provider也需要与一个URI对应。每一个Content Provider可以控制多个数据集,在这种情况下,每一个数据集会对应一个单独的URI。所有的URI必须以“content://”开头。

为了程序更容易维护,也为了简化程序代码,一般将URI定义成一个常量。例如,下面的常量表示系统的联系人电话号码。

1.android.provider.Contacts.Phones.CONTENT_URI

下面来看一下编写Content Provider的具体步骤。

1. 编写一个继承于android.content.ContentProvider的子类。该类是

ContentProvider的核心类。在该类中会实现query、insert、update及delete方

法。实际上调用ContentResolver类的这4个方法就是调用ContentProvider类

中与之要对应的方法。在本文中只介绍query。至于insert、update、delete和

query的用法类似。也是通过Uri传递参数,然后在这些方法中接收这些参数,并

做进一步地处理。

2. 在AndroidManifest.xml文件中配置ContentProvider。要想唯一确定一个

ContentProvider,需要指定这个ContentProvider的URI,除此之外,还需要指定URI所对应的ContentProvider类。这有些象Servlet的定义,除了要指定Servlet 对应的Web地址,还要指定这个地址所对应的Servlet类。

现在来看一下Uri的具体格式,先看一下如图5所示的URI。

下面对图5所示的URI的4个部分做一下解释。

A:Content Provider URI的固定前缀,也就是说,所有的URI必须以content://开头。

B:URI中最重要的部分。该部分是Content Provider的唯一标识。对于第三方应用程序来说,该部分最后使用完整的类名(包名+类名),以确保URI的唯一性。

该部分需要在AndroidManifest.xml文件中标签中定义,代码如下:

1.

2. . . . >

C:这部分是URI的路径(path)。表示URI中各种被请求的数据。这部分是可选的,如果Content Provider仅仅提供一种请求的数据,那么这部分可以省略。

如果Content Provider要提供多种请求数据。就需要添加多个路径,甚至是子路径。例如,“land/bus”、“land/train”、“sea/ship” 就指定了3种可能提供的数据。

D:这部分也是可选的。如果要传递一个值给Content Provider,可以通过这部分传递。当然,如果不需要传值,这部分也可以省略,省略后的URI如下所示:

1.content://com.example.transportationprovider/trains

本例利用了《基于android SDK1.5的英文电子词典的实现》一文中实现的电子词典程序。通过ContentProvider,将电子词典的查词功能共享成Cursor对象。这样其他的应用程序就可以通过ContentProvider来查词英文单词了。关于英文词典的具体实现细节,读者可以通过如下的地址查看《基于android SDK1.5的英文电子词典的实现》一文。

1.http://www. android https://www.sodocs.net/doc/e212525105.html,/article/show/111

在电子词典程序中需要一个DictionaryContentProvider类,该类是ContentProvider的子类。在该类中实现了query方法,并根据不同的URI来返回不同的结果。让我们先看一下DictionaryContentProvider类,然后再对这些代码做一些解释。

1.... ...

2.public class DictionaryContentProvider extends ContentProvider

3.{

4.private static UriMatcher uriMatcher;

5.private static final String AUTHORITY = "net.blogjava.mobile.dictio

narycontentprovider" ;

6.private static final int SINGLE_WORD = 1 ;

7.private static final int PREFIX_WORDS = 2 ;

8.public static final String DATABASE_PATH = android.os.Environment

9. .getExternalStorageDirectory().getAbsolutePath()

10. + "/dictionary" ;

11.public static final String DATABASE_FILENAME = "dictionary.db" ;

12.private SQLiteDatabase database;

13.static

14. {

15.// 添加访问ContentProvider的Uri

16. uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

17. uriMatcher.addURI(AUTHORITY, "single" , SINGLE_WORD);

18. uriMatcher.addURI(AUTHORITY, "prefix/*" , PREFIX_WORDS);

19. }

20.// 该方法在Activity的onCreate方法之前调用

21.@Override

22.public boolean onCreate()

23. {

24. database = openDatabase();

25.return true ;

26. }

27.// 在本例中只实现了query方法,其他的方法(insert、update和delete)与query

方法的实现

28.// 类似

29.@Override

30.public Cursor query(Uri uri, String[] projection, String selection,

31. String[] selectionArgs, String sortOrder)

32. {

33. Cursor cursor = null ;

34.switch (uriMatcher.match(uri))

35. {

36.case SINGLE_WORD:

37.// 查找指定的单词

38. cursor = database.query("t_words" , projection, selection,

39. selectionArgs, null , null , sortOrder);

40.break ;

41.case PREFIX_WORDS:

42. String word = uri.getPathSegments().get(1 );

43.// 查找以指定字符串开头的单词集合

44. cursor = database

45. .rawQuery(

46."select english as _id, chinese from t_wor

ds where english like ?" ,

47.new String[]

48. { word + "%" });

49.break ;

50.

51.default :

52.throw new IllegalArgumentException("<" + uri + ">格式不

正确." );

53. }

54.return cursor;

55. }

56. ... ...

57.}

关于DictionaryContentProvider类的代码需要做如下的解释。

1. 在DictionaryContentProvider类的开头定义的AUTHORITY是访问

ContentProvider的URI的前半部分。

2. 访问ContentProvider的URI的后半部分由uriMatcher.addURI(...)方法指定。

该方法的第1个参数就是AUTHORITY(Uri的前半部分),第2个参数是Uri 的后半部分,第3个参数是与第2个参数值对应的代码。当其他的应用程序通过Uri访问ContentProvider时。系统解析Uri后,将addURI方法的第2个参数值转换成与之对应的代码(第3个参数值)。

3. addURI的第2个参数值可以使用通配符。例如,prefix/*中的*表示所有字符。

prefix/abc、prefix/xxx都会匹配成功。

4. 访问ContentProvider的URI是addURI的第1个和第2个参数值的组件,例

如,按着DictionaryContentProvider中设置的两个URI,可以分别匹配下面的两个URI。

1.content://net.blogjava.mobile.dictionarycontentprovider/single

2.content://net.blogjava.mobile.dictionarycontentprovider/prefix/wo

要注意的是,访问ContentProvider的URI必须以“content://”开头。

5. 在query方法中建议使用SQLiteDatabase对象的query方法查询。因为query

方法的参数正好和DictionaryContentProvider类中的query方法的参数对应,这

样使用起来比较方便。

6. 由于安装了ContentProvider的应用程序会先调用ContentProvider的

onCreate方法(该方法会在Activity的onCreate方法之前调用),因此,只需

要将打开或复制数据库的方法(openDatabase)放在DictionaryContentProvider

类中,并在onCreate方法中调用即可。

7. 在DictionaryContentProvider类中只实现了query方法。在该方法中判断了

其他应用程序发送的是哪一个Uri。并进行相应的处理。这两个Uri一个是查询指

定单词的,另外一个是查询以某个字符串开头的所有单词的(用于显示单词列表)。

下面在AndroidManifest.xml文件中配置DictionaryContentProvider类。

1.

2. android:authorities="net.blogjava.mobile.dictionarycontentprov

ider" />

OK,现在来看看应用程序如何调用ContentProvider。调用ContentProvider的关键是使用getContentResolver方法来获得一个ContentResolver对象,并通过ContentResolver 对象的query方法来访问ContentProvider。

首先来定义两个访问ContentProvider的常量。

1.public final String DICTIONARY_SINGLE_WORD_URI = "content://net.blogjava

.mobile.dictionarycontentprovider/single" ;

2.public final String DICTIONARY_PREFIX_WORD_URI = "content://net.blogjava

.mobile.dictionarycontentprovider/prefix" ;

然后在查询按钮的单击事件中编写如下的代码来查询单词。

1.public void onClick(View view)

2.{

3. Uri uri = Uri.parse(DICTIONARY_SINGLE_WORD_URI);

4.// 通过ContentProvider查询单词,并返回Cursor对象,然后的操作就和直接从数

据中获得

5.// Cursor对象后的操作是一样的了

6. Cursor cursor = getContentResolver().query(uri, null , "english=?" ,

7.new String[]{ actvWord.getText().toString() }, null );

8. String result = "未找到该单词." ;

9.if (cursor.getCount() > 0 )

10. {

11. cursor.moveToFirst();

12. result = cursor.getString(cursor.getColumnIndex("chinese" ));

13. }

14.new AlertDialog.Builder(this ).setTitle("查询结果

" ).setMessage(result)

15. .setPositiveButton("关闭" , null ).show();

16.

17.}

下面是显示单词列表的代码。

1.public void afterTextChanged(Editable s)

2.{

3.if ("" .equals(s.toString()))

4.return ;

5. Uri uri = Uri.parse(DICTIONARY_PREFIX_WORD_URI + "/" + s.toString());

6.// 从ContentProvider中获得以某个字符串开头的所有单词的Cursor对象

7. Cursor cursor = getContentResolver().query(uri, null , null , null , n

ull );

8. DictionaryAdapter dictionaryAdapter = new DictionaryAdapter(this ,

9. cursor, true );

10. actvWord.setAdapter(dictionaryAdapter);

11.}

现在来运行本例,会看到如图6所示的界面。当查询单词时会显示如图7所示的单词列表,查询出结果后,会显示如图8所示的界面。

方式三:广播(Broadcast)

广播是一种被动跨进程通讯的方式。当某个程序向系统发送广播时,其他的应用程序只能被动地接收广播数据。这就象电台进行广播一样,听众只能被动地收听,而不能主动与电台进行沟通。

在应用程序中发送广播比较简单。只需要调用sendBroadcast方法即可。该方法需要一个Intent对象。通过Intent对象可以发送需要广播的数据。

先建一个android工程:sendbroadcast。在XML布局文件中放两个组件:EditText和Button,当单击按钮后,会弹出显示EditText组件中文本的对话框,关闭对话框后,会使用sendBroadcast方法发送消息,并将EditText组件的文本通过Intent对象发送出去。完整的代码如下:

1.package net.blogjava.mobile.sendbroadcast;

2.... ...

3.public class Main extends Activity implements OnClickListener

4.{

5.private EditText editText;

6.@Override

7.public void onClick(View view)

8. {

9.new AlertDialog.Builder(this ).setMessage(editText.getText().toSt

ring())

10. .setPositiveButton("确定" , null ).show();

11.// 通过Intent类的构造方法指定广播的ID

12. Intent intent = new Intent("net.blogjava.mobile.MYBROADCAST" );

13.// 将要广播的数据添加到Intent对象中

14. intent.putExtra("text" , editText.getText().toString());

15.// 发送广播

16. sendBroadcast(intent);

17. }

18. ... ...

19.}

发送广播并不需要在AndroidManifest.xml文件中注册,但接收广播必须在AndroidManifest.xml文件中注册receiver。下面来编写一个接收广播的应用程序。首先建立一个android工程:receiver。然后编写一个MyReceiver类,该类是BroadcastReceiver 的子类,代码如下:

1.package net.blogjava.mobile.receiver;

2.... ...

3.public class MyReceiver extends BroadcastReceiver

4.{

5.// 当sendbroadcast发送广播时,系统会调用onReceive方法来接收广播

6.@Override

7.public void onReceive(Context context, Intent intent)

8.{

9.// 判断是否为sendbroadcast发送的广播

10.if ("net.blogjava.mobile.MYBROADCAST" .equals(intent.getAction())

)

11. {

12. Bundle bundle = intent.getExtras();

13.if (bundle != null )

14. {

15. String text = bundle.getString("text" );

16. Toast.makeText(context, "成功接收广播:

" + text, Toast.LENGTH_LONG).show();

17. }

18. }

19. }

20.}

当应用程序发送广播时,系统会调用onReceive方法来接收广播,并通过

intent.getAction()方法返回广播的ID,也就是在发送广播时Intent构造方法指定的字符串。然后就可以从Bundle对象中获得相应的数据了。

最后还需要在AndroidManifest.xml文件中注册receiver,代码如下:

1.

在注册MyReceiver类时需要使用标签,android:name属性指定MyReceiver类,标签的android:name指定了广播的ID。

首先运行receiver程序,然后就可以关闭receiver程序了。接收广播并不依赖于程序的状态。就算程序关闭了,仍然可以接收广播。然后再启动sendbroadcast程序。并在文本框中输入“android”,然后单击按钮,会弹出一个显示文本框内容的对话框,如图9所示。当关闭对话框后,会显示一个Toast信息提示框,这个信息框是由receiver程序弹出的。如图10所示。

方式四:AIDL服务

服务(Service)是android系统中非常重要的组件。Service可以脱离应用程序运行。也就是说,应用程序只起到一个启动Service的作用。一但Service被启动,就算应用程序关闭,Service仍然会在后台运行。

android系统中的Service主要有两个作用:后台运行和跨进程通讯。后台运行就不用说了,当Service启动后,就可以在Service对象中运行相应的业务代码,而这一切用户并不会察觉。而跨进程通讯是这一节的主题。如果想让应用程序可以跨进程通讯,就要使用我们这节讲的AIDL服务,AIDL的全称是Android Interface Definition Language,也就是说,AIDL实际上是一种接口定义语言。通过这种语言定义接口后,Eclipse插件(ODT)会自动生成相应的Java代码接口代码。下面来看一下编写一个AIDL服务的基本步骤。

权限说明大全

程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 各种权限说明如下: android.permission.ACCESS_CHECKIN_PROPERTIES 允许读写访问”properties”表在checkin数据库中,改值可以修改上传( Allows read/write access to the “properties” table in the checkin database, to change values that get upload ed) android.permission.ACCESS_COARSE_LOCATION 允许一个程序访问CellID或WiFi热点来获取粗略的位置(Allows an application to access coarse (e.g., Cell-ID, WiFi) location) android.permission.ACCESS_FINE_LOCATION 允许一个程序访问精良位置(如GPS) (Allows an application to access fine (e.g., GPS) location) android.permission.ACCESS_LOCATION_EXTRA_COMMANDS 允许应用程序访问额外的位置提供命令(Allows an application to access extra location provider commands) android.permission.ACCESS_MOCK_LOCA TION 允许程序创建模拟位置提供用于测试(Allows an application to create mock location providers for testing) android.permission.ACCESS_NETWORK_STA TE 允许程序访问有关GSM网络信息(Allows applications to access information about networks) android.permission.ACCESS_SURFACE_FLINGER 允许程序使用SurfaceFlinger底层特性(Allows an application to use SurfaceF linger’s low level features) android.permission.ACCESS_WIFI_STATE 允许程序访问Wi-Fi网络状态信息(Allows applications to access information about Wi-Fi networks) android.permission.ADD_SYSTEM_SERVICE 允许程序发布系统级服务(Allows an application to publish system-level services). android.permission.BA TTERY_STATS 允许程序更新手机电池统计信息(Allows an application to update the collected battery statistics) android.permission.BLUETOOTH 允许程序连接到已配对的蓝牙设备(Allows applications to connect to paired bluetooth devices) android.permission.BLUETOOTH_ADMIN 允许程序发现和配对蓝牙设备(Allows applications to discover and pair bluetooth devices) android.permission.BRICK 请求能够禁用设备(非常危险)(Required to be able to disable the device (very *erous!).) android.permission.BROADCAST_PACKAGE_REMOVED 允许程序广播一个提示消息在一个应用程序包已经移除后(Allows an application to broadcast a notification that an application package has been removed) android.permission.BROADCAST_STICKY 允许一个程序广播常用intents(Allows an application to broadcast sticky intents) android.permission.CALL_PHONE

Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析

在前面几篇文章中,我们详细介绍了Android系统进程间通信机制Binder的原理,并且深入分析了系统提供的Binder运行库和驱动程序的源代码。细心的读者会发现,这几篇文章分析的Binder接口都是基于C/C++语言来实现的,但是我们在编写应用程序都是基于Java语言的,那么,我们如何使用Java语言来使用系统的Binder机制来进行进程间通信呢?这就是本文要介绍的Android系统应用程序框架层的用Java语言来实现的Binder接口了。 熟悉Android系统的读者,应该能想到应用程序框架中的基于Java语言的Binder接口是通过JNI来调用基于C/C++语言的Binder运行库来为Java应用程序提供进程间通信服务的了。JNI在Android系统中用得相当普遍,SDK中的Java 接口API很多只是简单地通过JNI来调用底层的C/C++运行库从而为应用程序服务的。 这里,我们仍然是通过具体的例子来说明Binder机制在应用程序框架层中的Java接口,主要就是Service Manager、Server和Client这三个角色的实现了。通常,在应用程序中,我们都是把Server实现为Service的形式,并且通过IServiceManager.addService接口来把这个Service添加到Service Manager,Client也是通过IServiceManager.getService接口来获得Service接口,接着就可以使用这个Service提供的功能了,这个与运行时库的Binder接口是一致的。 前面我们学习Android硬件抽象层时,曾经在应用程序框架层中提供了一个硬件访问服务HelloService,这个Service运行在一个独立的进程中充当Server的角色,使用这个Service的Client运行在另一个进程中,它们之间就是通过Binder机制来通信的了。这里,我们就使用HelloService这个例子来分析Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码。所以希望读者在阅读下面的内容之前,先了解一下前面在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务这篇文章。 这篇文章通过五个情景来学习Android系统进程间通信Binder机制在应用程序框架层的Java接口:1. 获取Service Manager的Java远程接口的过程;2. HelloService接口的定义;3. HelloService的启动过程;4. Client获取HelloService 的Java远程接口的过程;5. Client通过HelloService的Java远程接口来使用HelloService提供的服务的过程。 一. 获取Service Manager的Java远程接口

Android用户权限列表

我们在安装Android软件的时候,系统会提示该软件所需要的权限,相对于其他系统,android的权限非常多。我们在开发软件的时候,也需要声明相应的权限,比如希望软件能发短信,需要声明软件调用短信的权限,否则软件运行的时候就会报错。 Android的权限在AndroidManifest.xml文件里配置。AndroidManifest文件中有四个标签与permission有关,它们分别是 。其中最常用的是 ,当我们需要获取某个权限的时候就必须在我们的manifest文件中声明 。 [html]view plain copy 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... 11. 12. 的作用相似,两者之间的不同之处, 是android预定义的权限,是自己定义的权 限。 用的相对较少, 这两个标签就更少见了,简单说 就是声明一个标签,该标签代 表了一组permissions,而是为一组permissions声明了一个namespace。后面三个标签具体使用方法见后续文章。 定义方法如下:

Android 杀掉自己进程的方法

Android 杀掉自己进程的方法 Process.killProcess(Process.myPid()); 代码如下 protected void quit() { int size = activityManager.activityStackCount(); for(int i =size-1 ; i > 0 ;i--) { Activity activity = activityManager.allT askActivity().get(i); activityManager.popActivity(activity); } activityManager = null; getActivity().finish(); //目前最为通用的关闭进程的方法以后的版本使用 Intent startMain = new Intent(Intent.ACTION_MAIN); startMain.addCategory(Intent.CATEGORY_HOME); startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(startMain); android.os.Process.killProcess(android.os.Process.myPid()); } android.os.Process.killProcess(appProcessInfo.pid);只能杀死自己所创建的进程,其它进程是杀不掉的,要用到另外一个方法 activityManager.killBackgroundProcesses(processName);,同是权限也要加上 以下是我的测试代码 public class ListViewActivity extends Activity { /** Called when the activity is first created. */ private Button button; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

Android下Camera框架解析

Android 下Camera 构架分析 一. Android Camera 层次结构 Android 下Camera 子系统从上到下可以分为应用层、框架层、运行库层及内核层,其结构如下图所示。从整体上看,它还是属于Android 下典型的client/service 的结构,运行在两个进程中,一个是client 进程,主要包括JA V A 代码与一些Native c/c++代码;另一个是service 进程,属于服务端,是native c/c++代码,并且,camera service 属于Android 系统的一个native 服务,用native c/c++代码实现,主要负责和Linux kernel 中的Camera Driver 交互,搜集Linux kernel 中Camera Driver 上传的数据,并交给显示系统(surface)显示。 client 进程与service 进程通过Binder 机制通信,client 端通过调用service 端的接口实现各个具体的功能。但真正的preview 数据不会通过Binder IPC 机制从service 端复制到client 端,而是通过回调函数与消息的机制将preview 数据buffer 的地址传到client 端,最终可在Java 应用中操作处理这个preview 数据。 android_hardware.camera Camera Apps Libandroid_runtime.so (android_hardware_Camera.cpp) libcamera_client.so (Camara.cpp) 应用层框架层运行库层 硬件层 Libcamera.so (HAL)libcameraservice.so (CameraService.cpp)Linux 内核层 V4L2 Kernel Driver Camera Hardware BinderIPC JNI Client Service 二. Android Camera 的代码结构 1)应用层 Camera 的应用层在Android 上表现为直接调用SDK API 开发的一个

Android permission 访问权限说明手册

Android permission 访问权限说明手册 tech.er 2011年2月12日 android平台上的权限许可分得很细,如果软件无法正常执行时,首先要检查是不是缺少相关的permission声明,以下就把permission 访问权限列举出来供大家参考。 程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 完整列表如下: android.permission.ACCESS_CHECKIN_PROPERTIES 允许读写访问”properties”表在checkin数据库中,改值可以修改上传( Allows read/write access to the “properties” table in the checkin database, to change values that get uploaded) android.permission.ACCESS_COARSE_LOCATION 允许一个程序访问CellID或WiFi热点来获取粗略的位置(Allows an application to access coarse (e.g., Cell-ID, WiFi) location) android.permission.ACCESS_FINE_LOCATION 允许一个程序访问精良位置(如GPS) (Allows an application to access fine (e.g., GPS) location) android.permission.ACCESS_LOCATION_EXTRA_COMMANDS 允许应用程序访问额外的位置提供命令(Allows an application to access extra location provider commands) android.permission.ACCESS_MOCK_LOCATION 允许程序创建模拟位置提供用于测试(Allows an application to create mock location providers for testing) android.permission.ACCESS_NETWORK_STATE 允许程序访问有关GSM网络信息(Allows applications to access information about networks) android.permission.ACCESS_SURFACE_FLINGER 允许程序使用SurfaceFlinger底层特性(Allows an application to use SurfaceFlinger’s low level features) android.permission.ACCESS_WIFI_STATE 允许程序访问Wi-Fi网络状态信息(Allows applications to access information about Wi-Fi networks) android.permission.ADD_SYSTEM_SERVICE 允许程序发布系统级服务(Allows an application to publish system-level services). android.permission.BATTERY_STATS 允许程序更新手机电池统计信息(Allows an application to update the collected battery statistics) android.permission.BLUETOOTH

Android SERVICE后台服务进程的自启动和保持

Android SERVICE后台服务进程的自启动和保持 Service组件在android开发中经常遇到,其经常作为后台服务,需要始终保持运行,负责处理一些必要(见不得人)的任务。而一些安全软件,如360等,会有结束 进程的功能,如果不做Service的保持,就会被其杀掉。 在早些时候,我们可以通过在 1. service中重写onStartCommand方法,这个方法有三个返回值, START_STICKY 是service被kill掉后自动 public int onStartCommand(Intent intent, int flags, int startId) { return START_STICKY; } 2. 配置android:persistent="true" 3. setForeground(true); 4. android:process=”com.xxx.xxxservice”配置到单独的进程中 以上的方法要么只是提升service优先级或者存活率, 并不能解决被安全软件强行 杀死的问题。要么像第四种单独的进程运行service在360老的版本是可以的,但是在360的比较新的版本中仍然会被杀死. 如何保持Service的运行状态是现在要说明的,核心就是利用ANDROID的系统广播,触发自己的程序检查Service的运行状态,如果被杀掉,就再起来。 常用的有开机广播,解锁屏幕的广播,电量变化等等,其中解屏的广播算比较频 繁的了,但是也并不能保证一定的频率,尤其是在特定的时间里(比如用户睡觉的时候,用户并不进行解锁操作).而我们仍要做一些操作的时候,就没有办法了。 因此,我采用了一种别的方案. 另外再加上两个类似一守护进程的Service,分别检查Service的运行状态,注册响应的广播,对其进行守护,一旦发现没有运行就将其 启动. 我利用的系统广播是:Intent.ACTION_TIME_TICK。这个广播每分钟发送一次, 我们可以每分钟检查一次Service的运行状态,如果已经被结束了,就重新启动Service。它的优点就是间隔时间短而且非常稳定, 而其他的广播并不能保证这一点,当然,在具体的应用中还是要根据需求使用, 结合其他广播来保证自己的service一定会 被重启。毕竟现在安全软件是越来越厉害了,更新得也是非常频繁. 有时间还是要看下还有没有其他的方法,综合几种来使用.

基于Android平台的手机通讯录管理系统

第一章绪论 1.1 项目研究背景 经过多年的发展,随着第三代网络的使用及四代网络的即将来了呢,移动终 端不再仅是通讯网络的终端,还将成为互联网的终端。因此,移动终端的应用 软件和需要的服务将会有很大的发展空间。Google与包括HTC、摩托罗拉、三星、联想等在内的三十多家技术和无线应用的领军企业组成的开发联盟为此于2007年11月退出了一份专为移动设备设计的软件平台——Android OS。 Android 是一套真正意义上的移动性设备综合平台,它包括操作系统、中间 件和一些关键的平台应用。Android的Java程序运行环境包含一组Java核心函数库及Dalvik虚拟机,它们有效地优化额Java程序的运行过程。Android 系统平台基于优化了的Linux内核,它提供诸如内存管理、进程管理、设备驱动等服务,同时也是手机硬件的连接层。 Abdroid平台的开放性等特点既能促进技术(包括平台本身)的创新,又有 助于降低开发成本,还可以是运营商能非常方便地制定特色化的产品,因此, 它具有很大的市场发展潜力。 1.2 项目研究的目的及意义 随着3G网络的使用,移动终端不再仅是通讯网络的终端,还将成为互联网的终端。因此,移动终端的应用软件和需要的服务将会有很大的发展空间。在Google和Android手机联盟的共同推动下,Android在众多手机操作系统中脱颖而出,受到广大消费者的欢迎。 手机通讯录作为手机的基本功能之一,每天我们都在频繁地使用着。根据手 机功能的不断加强与完善,手机通讯录对于人们的意义,已经不仅仅像记事簿 一样显示通讯地址,而是向着个性化、人性化的方向发展。通讯录从无到有, 从英文到中文,经过了十几年的发展历程,今后的发展趋势就是从通讯录发展 为名片夹,也就是一个人名下,可以储存座机、手机、单位、地址、电子邮箱 等内容,这种名片夹在电话薄的基础上,大大丰富了内容,同时结构也发生了 革命性的的变化,而且随着手机的发展,相信更优秀的通讯录会越来越受到社 会各层认识的喜爱。 1.3系统主要内容与实现方式

小议Android多进程以致Application多次初始化

小议Android多进程以致Application多次初始化 最近遇到一个bug,当应用加了多进程后,比如总共进程数为N,会出现在startService()时onStartCommand()方法会被重复调用(N-1)次的奇怪现象。 祸起 最近遇到两个模块互不相干却受到影响的奇怪问题,一个push模块和一个DaemonProcess模块在一起后,会出现如下现像的问题当DaemonProcess为应用加了多进程后,比如总共进程数为N,会出现push模块在startService()时onStartCommand()方法会被重复调用(N-1)次的奇怪现象。 寻踪 ?因为我们用的是Jpush的原因,一开始以为是Jpush,但最后发现是因为引用多进程的原因 ?再寻找下去发现调用一次startService()时onStartCommand()运行多次 ?而这两者有何关系呢 举证 Demo测试: 首先在Application中申明四个service,其中ServiceA和ServiceC都各自另开一个进程,ServiceB和ServiceD都在主进程中,AndroidManifest.xml如下:

此时在Application中启动四个Service startService(new Intent(this, ServiceA.class)); startService(new Intent(this, ServiceB.class)); startService(new Intent(this, ServiceC.class)); startService(new Intent(this, ServiceD.class)); 同时各Service打下如下log: public static final String TAG = ServiceB.class.getSimpleName(); @Override public void onCreate() { super.onCreate();Log.i(TAG,"onCreate" + "pid:" + android.os.Process.myPid()); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i(TAG,"onStartCommand" + "pid:" + android.os.Process.myPid()); return super.onStartCommand(intent, flags, startId);

Android Binder设计与实现 – 设计篇

Android Binder设计与实现–设计篇 摘要 Binder是Android系统进程间通信(IPC)方式之一。Linux已经拥有管道、system V IPC、socket等IPC手段,却还要倚赖Binder来实现进程间通信,说明Binder具有无可比拟的优势。深入了解Binder并将之与传统 IPC做对比有助于我们深入领会进程间通信的实现和性能优化。 本文将对Binder的设计细节做一个全面的阐述,首先通过介绍Binder通信模型和Binder通信协议了解Binder的设计需求;然后分别阐述Binder在系统不同部分的表述方式和起的作用;最后还会解释Binder在数据接收端的设计考虑,包括线程池管理,内存映射和等待队列管理等。通过本文对Binder的详细介绍以及与其它IPC通信方式的对比,读者将对Binder的优势和使用Binder 作为Android主要IPC方式的原因有深入了解。 1.引言 基于Client-Server的通信方式广泛应用于从互联网和数据库访问到嵌入式手持设备内部通信等各个领域。智能手机平台特别是Android 系统中,为了向应用开发者提供丰富多样的功能,这种通信方式更是无处不在,诸如媒体播放,视音频捕获,到各种让手机更智能的传感器(加速度、方位、温度、光亮度等)都由不同的Server负责管理,应用程序只需作为Client与这些Server建立连接便可以使用这些服务,花很少的时间和精力就能开发出令人眩目的功能。Client-Server方式的广泛采用对进程间通信(IPC)机制是一个挑战。目前linux 支持的IPC包括传统的管道、System V IPC、即消息队列/共享内存/信号量,以及socket中只有socket支持Client-Server的通信方式。当然也可以在这些底层机制上架设一套协议来实现Client-Server通信,但这样增加了系统的复杂性,在手机这种条件复杂,资源稀缺的环境下可靠性也难以保证。 另一方面是传输性能。socket作为一款通用接口,其传输效率低,开销大,主要用在跨网络的进程间通信和本机上进程间的低速通信。消息队列和管道采用存储-转发方式,即数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区,至少有两次拷贝过程。共享内存虽然无需拷

安卓平板电脑ROOT权限说明

安卓平板电脑ROOT权限说明 就在我前面一节中就给大家提到过ROOT相关问题,此篇将给大家详细讲解ROOT权限,如果你以前经常去各大论坛一定也会接触到“ROOT”,他的出现频率很高,在各个论坛上,网友的字里行间经常会出现,那么ROOT权限是什么呢?可以给我们带来怎样的好处呢? 什么是root,我需要它做什么? root就是平板电脑的神经中枢,它可以访问和修改你平板电脑几乎所有的文件,这些东西可能是生产平板电脑的公司不愿意你修改和触碰的东西,因为他们有可能影响到平板电脑的稳定,还容易被一些黑客入侵(Root是Linux等类UNIX系统中的超级管理员用户帐户,该帐户拥有整个系统至高无上的权利,所有对象他都有可以操作的权利,所以很多黑客在入侵系统时,都要把权限提升到Root权限,就是将自己的非法帐户添加到Root用户组。类比于Administrator是Windows NT内核系统中的超级管理员用户帐户,也拥有最高的权限。但不同的是,在WINDOWS下Administrator的资源和别的用户资源是共享的,简单的说,别的用户可以访问Administrator的文件。而Linux中,别的用户是不能访问Root用户的家目录(/root)下文件的。因此,Linux比Windows更安全) 既然root权限这么重要,我们为什么还要去获取它? 其实用root的权限主要是因为我们很多东西是受限制的,我们只能利用这些权限来做我们被限制的去做的事情,比如Google禁止我们看到市场里很多免费或付费软件,我们可以用Marketenabler进去看;很多朋友只能看不能下,不能绑定gmail,我们可以修改hosts 来搞定他们,但这些都需要root权限(由于Root权限对于系统具有最高的统治权,便可方便的对于系统的部件进行删除或更改。对于玩家而言,最大的诱惑是在于“刷机”,只有获得Root权限,我们便可随心所欲地对自己的爱机进行“重新包装”,感受新版本软件的优点) 取得root的好处? 1 可以备份系统 2 使用高级的程序例如资源管理器 3 修改系统的程序 4 把程序安装在SD卡上(默认是不支持的) 绝大多数自制的rom都已经获取了root,如果你的rom没有的话,就要自己取得。 很重要的提示:如果你的平板电脑是行货,在保修之内,获取root就会丧失保修的权利。不知道通过以上内容,你是否对root权限有了更为透彻的了解了呢?当然ROOT也应该根据我们所需,如果你是个爱玩,爱研究平板电脑的机友,那么root权限就会对你很重要,但是如果你只是用平板电脑看看网页,看看电影,上上QQ,那么root显然和你没什么关系

Android系统启动流程(一)解析init进程

Android系统启动流程(一)解析init 进程 前言 作为“Android框架层”这个大系列中的第一个系列,我们首先要了解的是Android系统启动流程,在这个流程中会涉及到很多重要的知识点,这个系列我们就来一一讲解它们,这一篇我们就来学习init进程。 1.init简介 init进程是Android系统中用户空间的第一个进程,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建zygote(孵化器)和属性服务等。init进程是由多个源文件共同组成的,这些文件位于源码目录system/core/init。本文将基于Android7.0源码来分析Init进程。 2.引入init进程 说到init进程,首先要提到Android系统启动流程的前几步: 1.启动电源以及系统启动 当电源按下时引导芯片代码开始从预定义的地方(固化在ROM)开始执行。加载引导程序Bootloader到RAM,然后执行。 2.引导程序Bootloader 引导程序是在Android操作系统开始运行前的一个小程序,它的主要作用是把系统OS拉起来并运行。 3.Linux内核启动 内核启动时,设置缓存、被保护存储器、计划列表,加载驱动。当内核完成系统设置,它首先在系统文件中寻找”init”文件,然后启动root进程或者系统的第一个进程。 4.init进程启动 讲到第四步就发现我们这一节要讲的init进程了。关于Android系统启动流程的所有步骤会在本系列的最后一篇做讲解。 3.init入口函数 init的入口函数为main,代码如下所示。 system/core/init/init.cpp int main(int argc, char** argv) { if (!strcmp(basename(argv[0]), "ueventd")) { return ueventd_main(argc, argv); } if (!strcmp(basename(argv[0]), "watchdogd")) { return watchdogd_main(argc, argv);

android开机过程

一、Android开机启动流程简介 1、OS-level: 由bootloader载入linux kernel后kernel开始初始化, 并载入built-in 的驱动程序。Kernel完成开机后,载入init process,切换至user-space。 Init进程是第一个在user-space启动的进程。 2、Android-level: 由init process读取init.rc,Native 服务启动,并启动重要的外部程序,例如:servicemanager、Zygote以及System Server等。 由 init process 根据硬件类型读取init.xxx.rc。由init.xxx.rc加载init.xxx.sh。 由 init.xxx.sh 加载特定的硬件驱动。如hi_tuner.ko、hi_demux.ko等。 3、Zygote-Mode: Zygote 启动完SystemServer 后,进入Zygote Mode,在Socket 等候命令。 随后,使用者将看到一个桌面环境(Home Screen)。桌面环境由一个名为[Launcher]的应用程序负责提供。 本文档重点研究Android-level中的启动流程。 启动流程如下图所示:

二、init process流程分析 init进程简介 init进程是第一个在user-space启动的进程。由内核启动参数[init]传递给内核,如果该项没有设置,内核会按 /etc/init,/bin/init,/sbin/init,/bin/sh的顺序进行尝试,如果都有的都没找到,内核会抛出 kernel panic:的错误。

安卓进程android process media一直占用CPU、发热问题解决方法

关于安卓系统android.process.media进程一直占用CPU、消耗电池电量、手机发热、异常停止等的解决方案 一、现象: 手机开机一段长时间后,操作反应仍然巨慢,近似死机。 平时1分钟内完全开机,尔后操作会很顺畅,偶尔会有小卡,但不会完全卡死。开启“设置->开发者选项->监控->显示CPU使用情况”后,发现android.process.media一直在占用cpu。 通过Watchdog Task Manager和SystemTuner查看其CPU占用率,维持在60%以上。即使重启也一样卡死。(android 4.1.2) 二、分析: 1.“受DRM保护的内容的存储、下载管理器、下载内容、媒体存储”在同一个进程中,即android.process.media。开机后,进程android.process.media会运行一段时间后停止并转为后台(扫描时间因数据量而定,我的11G数据要扫描10分钟左右才停止,不过优先级比较低),其服务是一个MediaScannerService。android.process.media包括“受DRM保护的内容的存储、下载管理器、下载内容、媒体存储”等软件包。 2.系统升级、刷机后或数据出错,很容易出现android.process.media异常停止或一直占用CPU的情况。 3.某些程序开机启动,对系统进行扫描动作。 三、解决方案: 1.如果出现android.process.media一直占用CPU的情况,在“系统设置->应用->全部->下载管理器”中选择“清除数据”。 2.如果出现“andrioid.proces.media已停止”,在“设置->应用程序->管理应用程序->全部->媒体储存”中,选择“清除数据”。 3.有Root的手机,尽量安装管理软件,禁止一些不必要开机启动的软件。 PS:在保留用户数据而进行升级或刷机时,一些软件会出现异常停止的情况,也可以先尝试进入“管理应用”清除其数据。

AndroidManifest.xml配置文件详解

AndroidManifest.xml配置文件对于Android应用开发来说是非常重要的基础知识,本文旨在总结该配置文件中重点的用法,以便日后查阅。下面是一个标准的AndroidManifest.xml文件样例。 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. . . . 33. 34. 35. 36. 37. 38. . . . 39. 40.

“进程android.process.acore已意外停止”解决办法大全

“进程android.process.acore已意外停止”解决办法大全 一般我们在操作手机的时候,遇到出现的比较多的系统问题是出现“进程android.process.acore已意外停止”的提示。下面针对比较常出现的情况提供解决的办法。 一、三星的机子升级4.0.3后 兴致勃勃的刷机,但成功后总是FC,郁闷至极。但恢复出厂设置就没问题,刚开始以为是程序冲突,后来发现并不是这样,清空通讯录也可以正常使用。 解决方法:设置——应用程序管理——将google通讯录同步、联系人存储、通讯录这三项清除数据,注意先备份。之后再设置——账户与同步——登陆google账户同步联系人即可。 二、刷机的时候因为失误操作,弹出了“android.process.acore出问题”的提示,重刷也无法解决。 出现这个提示不用担心,并不是手机出了毛病。“android.process.acore出问题“的解决的方法很简单。 解决方法:请先备份一下手机的联系人资料,然后进入设置,选择程序,选择程序管理,选择全部,找到联系人储存,然后清除数据,这样再刷机就没有问题了。某些手机显示的是“进程android.process.acore已意外停止”,解决方法是一样的。 三、小米手机出现了“android.process.acore ”的情况 如果是小米手机出现了“android.process.acore出问题”的提示,有可能是因为你删除了谷歌框架内重要的文件。 解决方法:请到小米官网上下载一个对应的升级包,然后放到SD卡内,选择系统更新,点击菜单键,选择安装包,找到你放入到SD卡中的安装包,选择立即更新,开始升级。等到升级完成后,重启手机,即可解决这个问题。

Android权限说明

Android权限分的很细,但命名比较人性化,Android permission比SymbianCapabilities有了不少改进,下面就来看看权限许可都有哪些定义吧,发现还是比较繁多的,如果发现你的程序某个地方调试错误很可能是Androidpermission 的访问控制在作怪,这也是为了安全防止手机成为病毒的场所。Android开发网获取到的消息来看不用购买高昂的数字签名证书,权限许可权由用户决定而不是手机制造商和平台提供商,这一点不得不说明为Android开发人员着想,下面的信息都是需要添加在androidmanifest.xml文件中。 程序执行需要读取到安全敏感项必需在androidmanifest.xml 中声明相关权限请求,Android开发网已经翻译并使用中英文对照 android.permission.ACCESS_CHECKIN_PROPERTIES允许读写访问"properties"表在checkin数据库中,改值可以修改上传( Allows read/write access to the "properties" table inthe checkin database, to change values that get uploaded) android.permission.ACCESS_COARSE_LOCATION允许一个程序访问CellID或WiFi热点来获取粗略的位置(Allows an application to access coarse (e.g., Cell-ID, WiFi)location) android.permission.ACCESS_FINE_LOCATION允许一个程序访问精良位置(如GPS) (Allows an application to access fine(e.g., GPS) location)

Android中的IPC binder机制

android 中的IPC binder 机制 第一部分 Binder的组成 1.1 驱动程序部分驱动程序的部分在以下的文件夹中: kernel/include/linux/binder.h kernel/drivers/Android/binder.c binder驱动程序是一个miscdevice,主设备号为10,此设备号使用动态获得(MISC_DYNAMIC_MINOR),其设备的节点为: /dev/binder binder驱动程序会在proc文件系统中建立自己的信息,其文件夹为 /proc/binde,其中包含如下内容: proc目录:调用Binder各个进程的内容 state文件:使用函数binder_read_proc_state stats文件:使用函数binder_read_proc_stats transactions文件:使用函数binder_read_proc_transactions transaction_log文件:使用函数binder_read_proc_transaction_log,其参数为binder_transaction_log (类型为struct binder_transaction_log) failed_transaction_log文件:使用函数 binder_read_proc_transaction_log 其参数为 binder_transaction_log_failed (类型为struct binder_transaction_log) 在binder文件被打开后,其私有数据(private_data)的类型: struct binder_proc 在这个数据结构中,主要包含了当前进程、进程ID、内存映射信息、Binder 的统计信息和线程信息等。 在用户空间对Binder驱动程序进行控制主要使用的接口是mmap、poll和ioctl,ioctl主要使用的ID为: #define BINDER_WRITE_READ _IOWR('b', 1, struct binder_write_read) #define BINDER_SET_IDLE_TIMEOUT _IOW('b', 3, int64_t) #define BINDER_SET_MAX_THREADS _IOW('b', 5, size_t)

相关主题