最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android跨應(yīng)用啟動(dòng)實(shí)例詳解

 更新時(shí)間:2017年04月23日 14:14:04   作者:小小強(qiáng)巨蟹球  
這篇文章主要介紹了 Android跨應(yīng)用啟動(dòng)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下

Android跨應(yīng)用啟動(dòng)

前言:

相信大家,很多時(shí)候都是在自己的應(yīng)用中,啟動(dòng)自己寫的Activity,Service、BroadcastReceiver、contentProvider 。換句話說(shuō),這些都只是 * 單個(gè)應(yīng)用中 組件間 * 的啟動(dòng)。而我們下面要談?wù)摰氖?兩個(gè)應(yīng)用間 組件 的啟動(dòng)。即——使用 隱式Intent方式 啟動(dòng)應(yīng)用B的某個(gè)組件。

一、在開始之前,先來(lái)梳理一下跨應(yīng)用啟動(dòng)的2種方式:

第一種:在Activity中,啟動(dòng)另一個(gè)app的組件。

第二種:在Service中,啟動(dòng)另一個(gè)app的組件。

從所周知,Android中有四大組件,那么為什么小編,只介紹Activity和Service中啟動(dòng)另一個(gè)應(yīng)用的四大組件?

其實(shí),BroadcastReceiver組件也是可以啟動(dòng) 4大組件的。這是因?yàn)閛nReceive()方法中會(huì)要求傳入context實(shí)例,有了context實(shí)例,就能使用context的方法,啟動(dòng)其他組件。

至于contentProvider,我想大家還沒見過(guò),這娃自動(dòng)去干過(guò)事情吧,都是被動(dòng)的調(diào)用。

所以在寫代碼的時(shí)候,我們經(jīng)常會(huì)在Activity或者Service中去啟動(dòng)一個(gè)組件,BroadcastReceiver很少,而contentProvider更是沒見過(guò)。

另外需要跟大家說(shuō)一下,Context類是一個(gè)抽象類,傳入的context實(shí)例是由其子類來(lái)實(shí)現(xiàn)的,這種——用父類聲明變量,由子類來(lái)實(shí)現(xiàn)的思維方式,在Java中是很常見的。特別是接口和抽象類,經(jīng)常用到這種方式。對(duì)于小編這種由C轉(zhuǎn)Java的人來(lái)說(shuō),真是一大坑啊。

為什么Activity和Service都可以直接使用圖中的四個(gè)方法呢,這是因?yàn)锳ctivity和Service都是繼承自ContextWrapper,所以子類擁有父類的方法。BroadcastReceiver和contentProvider則不是,具體大家可以看官方API。

二、跨應(yīng)用啟動(dòng)的實(shí)戰(zhàn)

** 下面讓我們正式進(jìn)入今天的主題:跨應(yīng)用啟動(dòng)實(shí)戰(zhàn)**

1:AppA的Activity中,啟動(dòng)AppB的Activity

Android提供了在一個(gè)App中啟動(dòng)另一個(gè)App中的Activity的能力,這使我們的程序很容易就可以調(diào)用其他程序的功能,從而就豐富了我們App的功能。比如在微信中發(fā)送一個(gè)位置信息,對(duì)方可以點(diǎn)擊這個(gè)位置信息啟動(dòng)騰訊地圖并導(dǎo)航。這個(gè)場(chǎng)景在現(xiàn)實(shí)中作用很大,尤其是朋友在陌生的環(huán)境找不到對(duì)方時(shí),這個(gè)功能簡(jiǎn)直就是救星。

本來(lái)想把本文的名字叫啟動(dòng)另一個(gè)進(jìn)程中的Activity。因?yàn)槊總€(gè)App都會(huì)運(yùn)行在自己的虛擬機(jī)中,每個(gè)虛擬機(jī)跑在一個(gè)進(jìn)程中。但仔細(xì)一想,能夠稱為一個(gè)進(jìn)程,前提是這個(gè)App必須要運(yùn)行起來(lái)才行。而Android提供的能力,是不需要另一個(gè)App啟動(dòng)就可以將其特定的Activity啟動(dòng)起來(lái)的。

也就是說(shuō)B應(yīng)用是處理未啟動(dòng)的狀態(tài),也就是還沒有成為系統(tǒng)的一個(gè)進(jìn)程,那么當(dāng)使用A啟動(dòng)B應(yīng)用的某個(gè)組件時(shí),請(qǐng)問(wèn),B應(yīng)用是否成為系統(tǒng)的進(jìn)程?答案是yes。怎么看呢,可以從Android Studio 的Android device monito 中結(jié)合虛擬機(jī)看。

我們有至少兩種辦法達(dá)到啟動(dòng)另一個(gè)App中的Activity。

第一種———隱式Intent的action方式。

相信這種方式,大家都不會(huì)陌生。這里就不進(jìn)行過(guò)多的解析。這里只貼一下AppB的manifest(文件清單):

從文件清單中,我們可以看到,appB中有兩個(gè)Activity。其中SecondActivity就是要被appA啟動(dòng)的Activity。
那么我們只要在appA的任意一個(gè)組件(Activity或Service),做如下的調(diào)用:

Intent intent=new Intent("android.intent.action.SecondActivity");
startActivity(intent);

就可以成功在 A應(yīng)用中 啟動(dòng)B應(yīng)用的 組件。另外還要跟大家說(shuō)一點(diǎn),SecondActivity的category一定要在文件清單中添加上,否則啟動(dòng)的時(shí)候會(huì)報(bào)錯(cuò)的。

不知道大家有沒有思考過(guò)這三個(gè)事情: 
1、當(dāng)A應(yīng)用 啟動(dòng) B應(yīng)用的SecondActivity,那么B應(yīng)用的MainActivity會(huì)不會(huì)被啟動(dòng)呢?正常情況下,我們點(diǎn)擊應(yīng)用B,進(jìn)到的是MainActivity這個(gè)活動(dòng),那么現(xiàn)在我們是通過(guò)跨應(yīng)用啟動(dòng),會(huì)不會(huì)要經(jīng)過(guò)B的MainActivity呢?答案是不會(huì)。

2、當(dāng)我們?cè)赟econdActivity中點(diǎn)擊Back回退鍵時(shí),回到的是A應(yīng)用的mainActivity界面,這里時(shí)候大家有沒有想過(guò)。 
SecondActivity和appA的mainActivity是不是同處于一個(gè)棧中呢?這時(shí)候就要去打印棧的ID了。

3、由上面的兩件事,不知道大家想起:Android對(duì)于Activity的管理,也就是framework層的ActivityManager。也就是說(shuō),你手機(jī)上的N多應(yīng)用,當(dāng)你打開某一個(gè)應(yīng)用是,這個(gè)應(yīng)用的Activity都是由ActivityManager這娃來(lái)創(chuàng)建和管理的。應(yīng)用本身并沒有創(chuàng)建Activity的能力。當(dāng)然這其中又涉及到了Ibinder的通訊。這里暫時(shí)不講。

第二種用intent設(shè)置className或component的辦法啟動(dòng)。舉例如下。

新建兩個(gè)項(xiàng)目ProjectA和ProjectB,用B中的MainActivity啟動(dòng)A的MainActivitity。關(guān)鍵代碼如下:

ProjectA MainActivity

@Override
 public void onClick(View v) {
 Intent intent = new Intent(Intent.ACTION_VIEW);
 String packageName = "com.example.mylife.anotherapp";
 String className = "com.example.mylife.anotherapp.MainActivity";
 intent.setClassName(packageName, className);
 //second method
 //intent.setComponent(new ComponentName("com.example.mylife.anotherapp","com.example.mylife.anotherapp.MainActivity"));
 Bundle bundle = new Bundle();
 bundle.putString("msg", "this message is from project B ");
 intent.putExtras(bundle);
 intent.putExtra("pid", android.os.Process.myPid());
 startActivityForResult(intent, 1);
 //startActivity(intent);
 }

 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 super.onActivityResult(requestCode, resultCode, data);
 switch (requestCode) {
 case 1:
 if(resultCode == RESULT_OK) {
 textView.setText(data.getStringExtra("result"));
 }
 break;
 }
 }

ProjectB MainActivity

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 textView = (TextView)findViewById(R.id.text);

 Intent intent = getIntent();
 if(intent != null) {
 textView.setText(intent.getStringExtra("msg"));
 }
 }

 public void OnClick(View view) {
 Intent intent = new Intent();
 intent.putExtra("result","OK! from project a.");
 this.setResult(RESULT_OK,intent);
 this.finish();//要清楚這里為什么要用finish()。
 }

注意:如果在應(yīng)用B中,是通過(guò)按下Back鍵,回退到應(yīng)用A的MainActivity活動(dòng),那么A的onActivityResult()方法是不會(huì)被回調(diào)的,這是因?yàn)镻rojectB的MainActivity活動(dòng)只是出棧而已,并沒有銷毀。而只有ProjectB的MainActivity活動(dòng)被銷毀的時(shí)候,才會(huì)回調(diào)A的onActivityResult()方法。那如果是按了Back鍵回退的話怎么處理呢?這時(shí)候只要重寫appB的onBackPressed()方法就好了。

@Override
public void onBackPressed() {
 super.onBackPressed();
 Intent intent = new Intent();
 intent.putExtra("result","OK! from project a.");
 this.setResult(RESULT_OK,intent);
 this.finish();//要清楚這里為什么要用finish()。
}

二:進(jìn)階———在A應(yīng)用的Activity中啟動(dòng)(停止)——B應(yīng)用的服務(wù)

應(yīng)用B的manifest

應(yīng)用B的service的代碼:

public class MyService extends Service {

 private static final String TAG = "MyService";
 public MyService() {
 }

 @Override
 public IBinder onBind(Intent intent) {
 // TODO: Return the communication channel to the service.
 throw new UnsupportedOperationException("Not yet implemented");
 }

 @Override
 public void onCreate() {
 super.onCreate();
 Log.d(TAG, "onCreate: ");
 }

 @Override
 public int onStartCommand(Intent intent,int flags, int startId) {
 Log.d(TAG, "onStartCommand: ");
 if(intent != null) {
 Log.d(TAG, "onStartCommand: "+intent.getStringExtra("msg"));
 }
 return super.onStartCommand(intent, flags, startId);

 }

 @Override
 public void onDestroy() {
 super.onDestroy();
 Log.d(TAG, "onDestroy: ");
 }
 }

應(yīng)用A的代碼:

@Override
 public void onClick(View v) {
 Intent intent = new Intent(Intent.ACTION_VIEW);
 String packageName = "com.example.mylife.anotherapp";
 String className = "com.example.mylife.anotherapp.MyService";
 intent.setClassName(packageName, className);

 switch (v.getId()) {
 case R.id.btn_start:
 Bundle bundle = new Bundle();
 bundle.putString("msg", "this message is from project B ");
 intent.putExtras(bundle);
 intent.putExtra("pid", android.os.Process.myPid());
 startService(intent);
 break;
 case R.id.btn_stop:
 stopService(intent);
 break;
 }
 }

測(cè)試結(jié)果:A應(yīng)用直接啟動(dòng)B應(yīng)用的服務(wù),而B應(yīng)用并不會(huì)打開自己的Activity。

本次代碼參考://m.fzitv.net/article/111896.htm

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • 查看 Android Studio NDK流程詳解

    查看 Android Studio NDK流程詳解

    這篇文章主要為大家介紹了查看 Android Studio NDK流程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Android自定義view實(shí)現(xiàn)帶header和footer的Layout

    Android自定義view實(shí)現(xiàn)帶header和footer的Layout

    這篇文章主要介紹了Android自定義view實(shí)現(xiàn)帶header和footer的Layout,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2023-02-02
  • Android實(shí)現(xiàn) Shape屬性gradient 漸變效果

    Android實(shí)現(xiàn) Shape屬性gradient 漸變效果

    這篇文章主要介紹了Android 實(shí)現(xiàn)Shape屬性gradient 漸變效果,gradient用以定義漸變色,可以定義兩色漸變和三色漸變,及漸變樣式,具體實(shí)現(xiàn)代碼感興趣的朋友跟隨小編一起看看吧
    2019-11-11
  • Android Mouse實(shí)現(xiàn)過(guò)程詳細(xì)筆記

    Android Mouse實(shí)現(xiàn)過(guò)程詳細(xì)筆記

    鼠標(biāo)的實(shí)現(xiàn)有兩個(gè)步驟,一個(gè)是所有層上面的一個(gè)圖標(biāo),還有一個(gè)就是事件控制
    2013-09-09
  • Android中自定義ImageView添加文字設(shè)置按下效果詳解

    Android中自定義ImageView添加文字設(shè)置按下效果詳解

    這篇文章主要給大家介紹了關(guān)于Android中自定義ImageView添加文字設(shè)置按下效果的相關(guān)資料,實(shí)現(xiàn)后的效果非常利用用戶的體驗(yàn),文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)下吧。
    2017-08-08
  • Android Drawable和Bitmap的轉(zhuǎn)換實(shí)例詳解

    Android Drawable和Bitmap的轉(zhuǎn)換實(shí)例詳解

    這篇文章主要介紹了Android Drawable和Bitmap的轉(zhuǎn)換實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • 如何在XML中定義菜單

    如何在XML中定義菜單

    這篇文章主要為大家詳細(xì)介紹了在XML中定義菜單的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Service與Activity之間的通信(同一進(jìn)程)

    Service與Activity之間的通信(同一進(jìn)程)

    這篇文章主要介紹了Service與Activity之間的通信(同一進(jìn)程)的相關(guān)資料,需要的朋友可以參考下
    2016-03-03
  • Android自定義PopWindow實(shí)現(xiàn)QQ、微信彈出菜單效果

    Android自定義PopWindow實(shí)現(xiàn)QQ、微信彈出菜單效果

    這篇文章主要為大家詳細(xì)介紹了Android自定義PopWindow實(shí)現(xiàn)QQ、微信彈出菜單效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Android SQLite數(shù)據(jù)庫(kù)進(jìn)行查詢優(yōu)化的方法

    Android SQLite數(shù)據(jù)庫(kù)進(jìn)行查詢優(yōu)化的方法

    這篇文章主要給大家介紹了關(guān)于Android SQLite數(shù)據(jù)庫(kù)進(jìn)行查詢優(yōu)化的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11

最新評(píng)論

五家渠市| 鄄城县| 芦溪县| 龙门县| 遵化市| 中西区| 方正县| 阳新县| 仪陇县| 平顺县| 永顺县| 平塘县| 清新县| 昭觉县| 开远市| 荥经县| 清涧县| 华池县| 秦安县| 彝良县| 冀州市| 达拉特旗| 武强县| 华亭县| 三门县| 嘉兴市| 清水河县| 垣曲县| 双江| 剑阁县| 昌邑市| 河北区| 宝兴县| 湘西| 阳朔县| 昌图县| 清镇市| 西乌珠穆沁旗| 绥化市| 白朗县| 克东县|