導航:首頁 > 操作系統 > android設置啟動activity

android設置啟動activity

發布時間:2022-09-03 03:57:42

A. android 不用startactivity 怎麼開啟activity的方法

啟動其他APK的Activity方法
有兩個app,分別叫做App1和App2。
App1包含兩個Activity,分別叫做App1_A和App1_B.其中App1_A是入口Activity.
也就是App1_A設置intent-filter,action為<action android:name="android.intent.action.MAIN" />
App2隻有一個Activity,叫做App2_A。
現在在App2_A中通過startActivity啟動App1_A是沒問題的.但是啟動App1_B的時候報了fc錯誤。
logcat如下:
08-03 02:23:44.119: WARN/ActivityManager(64): Permission denied: checkComponentPermission() reqUid=10030
08-03 02:23:44.119: WARN/ActivityManager(64): Permission Denial: starting Intent { act=android.intent.action.VIEW cmp=com.hello/.activity2 } from ProcessRecord{407c8bc8 665:com.fileExplorer/10032} (pid=665, uid=10032) requires null
用法如下:
Intent intent = new Intent();
ComponentName componentName = new ComponentName("com.hello","com.hello.App1_A");//這個沒問題
//ComponentName componentName = new ComponentName("com.hello","com.hello.App1_B");//這個報錯
intent.setComponent(componentName);
startActivity(intent);
解決方法:
(1)
通過隱式intent調用方法實現,需要在被調用的activity的manifest文件中添加
<intent-filter>
<action android:name="com.example.project.SHOW_ACTIVITY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
在StartActivity(it)之前,設定該intent對應的action(com.example.project.SHOW_ACTIVITY)
Intent intent = new Intent();
intent.setAction(action);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);推薦使用
利用setAction方法啟動Activity還有一個好處就是不需要知道包名和Activity類名,只需要知道action就可以隱式的啟動activity
(2)
即使直接指定了目標activity的ComponentName,跨應用的activity調用也要至少給目標activity指定一個帶action的filter。如:
<intent-filter>
<action android:name="" />
</intent-filter>
action name為空即可。
(3)給被調用的Activity增加一個帶action的filter,如下:
<intent-filter>
<action android:name="com.sdmc.ottplayer.uercenter" />
</intent-filter>
然後可以通過隱式Intent來調用,而不用使用intent.setComponent方法,如下就OK了(但是經過驗證,這種方法只是對APK的入口activity有用,對普通的沒用,和上面的問題一樣無法解決:啟動其他APK的非入口activity)
Intent i = new Intent("com.sdmc.ottplayer.uercenter");
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
this.startActivity(intent);

異常處理:
Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
Context中有一個startActivity方法,Activity繼承自Context,重載了startActivity方法。
如果使用 Activity的startActivity方法,不會有任何限制,
而如果使用Context的startActivity方法的話,就需要開啟一個新 的task,遇到上面那個異常的,都是因為使用了Context的startActivity方法。
解決辦法是,加一個flag。intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
Intent intent = new Intent();
intent.setClass(mContext, VideoPlayer.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);

B. Android NFC 如何啟動Activity

可以給所有的activity定義統一的一個action,然後搞一個acitivy,讓他來startpickeractivity,這樣,就會把所有的定義了action的activity列出來,讓用戶選擇

一開始啟動一個chooseActivity,在這裡面選,然後把選擇結果保存sp

以後進程序如果sp裡面有值就跳過chooseActivity

給個按鈕,可以重新呼出chooseActivity

最簡單的辦法

C. android 啟動 activity 是什麼意思

當應用運行起來後就會開啟一條線程,線程中會運行一個任務棧,當Activity實例創建後就會放入任務棧中。Activity啟動模式的設置在AndroidManifest.xml文件中,通過配置Activity的屬性android:launchMode=""設置。

1. Standard模式(默認)

我們平時直接創建的Activity都是這種模式的Activity,這種模式的Activity的特點是:只要你創建了Activity實例,一旦激活該Activity,則會向任務棧中加入新創建的實例,退出Activity則會在任務棧中銷毀該實例。

2. SingleTop模式

這種模式會考慮當前要激活的Activity實例在任務棧中是否正處於棧頂,如果處於棧頂則無需重新創建新的實例,會重用已存在的實例,否則會在任務棧中創建新的實例。

3. SingleTask模式

如果任務棧中存在該模式的Activity實例,則把棧中該實例以上的Activity實例全部移除,調用該實例的newInstance()方法重用該Activity,使該實例處於棧頂位置,否則就重新創建一個新的Activity實例。

4. SingleInstance模式

當該模式Activity實例在任務棧中創建後,只要該實例還在任務棧中,即只要激活的是該類型的Activity,都會通過調用實例的newInstance()方法重用該Activity,此時使用的都是同一個Activity實例,它都會處於任務棧的棧頂。此模式一般用於載入較慢的,比較耗性能且不需要每次都重新創建的Activity。

D. android怎麼設置程序啟動進去就是自己指定的activity

沒明白你到底要做什麼 ,如要要做的效果是 點擊 app圖標就啟動到你的 activity 中 可以看看下面的配置
<activity
android:name="org.xiaoyuno.LogoActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

E. android 怎麼獲取一個activity啟動模式

在Android中每個界面都是一個Activity,切換界面操作其實是多個不同Activity之間的實例化操作。在Android中Activity的啟動模式決定了Activity的啟動運行方式。
Android總Activity的啟動模式分為四種:

Activity啟動模式設置:

<activity android:name=".MainActivity" android:launchMode="standard" />

Activity的四種啟動模式:

1. standard

模式啟動模式,每次激活Activity時都會創建Activity,並放入任務棧中。

2. singleTop

如果在任務的棧頂正好存在該Activity的實例, 就重用該實例,否者就會創建新的實例並放入棧頂(即使棧中已經存在該Activity實例,只要不在棧頂,都會創建實例)。

3. singleTask

如果在棧中已經有該Activity的實例,就重用該實例(會調用實例的onNewIntent())。重用時,會讓該實例回到棧頂,因此在它上面的實例將會被移除棧。如果棧中不存在該實例,將會創建新的實例放入棧中。

4. singleInstance

在一個新棧中創建該Activity實例,並讓多個應用共享改棧中的該Activity實例。一旦改模式的Activity的實例存在於某個棧中,任何應用再激活改Activity時都會重用該棧中的實例,其效果相當於多個應用程序共享一個應用,不管誰激活該Activity都會進入同一個應用中。

其中standard是系統默認的啟動模式。

下面通過實例來演示standard的運行機制:

1 private TextView text_show;
2 private Button btn_mode;
3
4 @Override
5 public void onCreate(Bundle savedInstanceState) {
6 super.onCreate(savedInstanceState);
7 setContentView(R.layout.activity_main);
8
9 text_show = (TextView) this.findViewById(R.id.text_show);
10
11 text_show.setText(this.toString());
12
13 btn_mode = (Button) this.findViewById(R.id.btn_mode);
14
15 }
16
//按鈕單擊事件
17 public void LaunchStandard(View v){
18 startActivity(new Intent(this,MainActivity.class));
19
20 text_show.setText(this.toString());
21 }

F. Android 10.0 Activity的啟動流程

本文主要學習記錄,基於Android 10的源碼,有錯誤歡迎指正,主要目的是梳理流程圖。

以進程為單位的調用棧圖如下:

1.activity中的startActivity方法最終都會通過拿到ATSM的代理IActivityTaskManager調用的startActivity;

2.之後進入system server進程中的ATMS startActivity,ATMS 經過收集Intent信息,然後使用ActivityStackSupervisor.startSpecificActivityLocked,如果進程已經存在,則直接使用realStartActivityLocked,通過App的binder客戶端的代理ApplicationThread調用回到bindApplication,走入Activity的啟動流程;如果進程不存在則通過socket鏈接Zygote,請求fork新的進程;

3.App進程創建完成後,進程啟動會調用ActivityThread.main方法,初始化主線程Handler,接著走入attach方法,然後通過AMS的代理調用AMS的attachApplication方法,並將App進程的通信代理ApplicationThread傳入AMS;

4.AMS獲取到ATMS調用ApplicationThread的bindApplication回到App進程的ActivityThread.ApplicationThread.bindApplication方法中,然後使用Handler切換到主線程執行handleBindApplication,這里初始化了App的進程名字、時間,用戶的硬體配置,包括App的文件系統,創建了App的Context實例,Instrumentation實例,調用App的onCreate回調方法,同時告訴AMS APP初始化工作完畢;

5.AMS接著會調用ATMS的attachApplication,最後調用ClientLifecycleManager的scheleTransaction方法,通過App的Binder代理ApplicationThread回到ActivityThread;

6.進入ActivityThread.ApplicationThread.scheleTransaction方法之後就進入了Activity的onStart、onResume回調

創建進程之前的過程主要是AMS的內部信息收集的判斷的過程,下面主要看一下App進程啟動的源碼流程

從應用進程被創建開始,ActivityThread.main被執行

調用ActivityThread的attach方法,然後將activity和AMS通信的Binder代理IApplicationThread實例傳入AMS

接著進入AMS進程,ActivityManagerService.attachApplicationLocked

1.thread.bindApplication :該方法主要講App進程的配置信息通過IApplicationThread Binder通信回傳到ActivityThread中

2.mAtmInternal.attachApplication :mAtmInternal實際就是ActivityTaskManager的實例,通過LocalServices載入

那麼這里相當於走到了ActivityTaskManagerServer的attachApplication中

先看第一條:

注意:ActivityThread中存在於Binder通信的代理--》ApplicationThread extends IApplicationThread.Stub

ActivityThread--》ApplicationThread--》bindApplication

這里的bindApplication主要初始化了AppBindData,然後發送BIND_APPLICATION給APP的主線程BIND_APPLICATION,最後執行了handleBindApplication

handleBindApplication如下:

ActivityThread--》class H extends Handler

該方法主要在App進程中對App的一些硬體資源配置申請的屬性、App的文件夾等完成App基本信息的初始化

接著看第二條:mAtmInternal.attachApplication

mAtmInternal.attachApplication最終會調用mRootActivityContainer.attachApplication(wpc)

RootActivityContainer.attachApplication

接著調用ActivityStackSupervisor.realStartActivityLocked開始創建Activity

ActivityStackSupervisor.realStartActivityLocked

創建ClientLifecycleManager和ClientTransactionHandler來輔助管理Activity的生命周期

注意

clientTransaction.addCallback是LaunchActivityItem

lifecycleItem是ResumeActivityItem

ClientLifecycleManager.scheleTransaction最終會調用ClientTransaction的schele方法

那麼這個mClient是IApplicationThread的實例,那麼此時也就回到了ActivityThread的ApplicationThread中

ActivityThread的ApplicationThread中

因為ActivityThread繼承ClientTransactionHandler,所以到了ClientTransactionHandler中

通過Handler發送消息EXECUTE_TRANSACTION到H中

接著TransactionExecutor的execute方法

LaunchActivityItem.execute方法

client其實是在ActivityThread的實例,那麼就回到了ActivityThread的handleLaunchActivity

接著調用performLaunchActivity

在performLaunchActivity中,主要是載入App的資源包,然後創建了Activity的context實例,並創建了Activity的實例,接著調用activity.attach方法,attach執行完之後調用了onCreate方法。

activity.attach

activity.attach中主要

1.創建了PhoneWindow實例

2.設置了Window介面的監聽

3.初始化了成員變數,包括線程和WindowManager

到此Oncreate已經完成,那麼OnStart和OnResume去哪了?

TransactionExecutor的execute方法

之前們只分析了executeCallbacks,接著executeLifecycleState方法

TransactionExecutor的executeLifecycleState方法

cycleToPath:lifecycleItem即為ResumeActivityItem

第一點:

int finish = lifecycleItem.getTargetState()

lifecycleItem對應ResumeActivityItem,如下:

ResumeActivityItem的getTargetState方法

對應ActivityLifecycleItem中的枚舉類型:

第二點:ActivityClientRecord中的mLifecycleState,由於在前面已經執行了handleLaunchActivity所以mLifecycleState=1

對應ActivityLifecycleItem中的枚舉類型:

PRE_ON_CREATE = 0

所以final int star = 1

接著看getLifecyclePath,此時start=1,finish=3

那麼返回的IntArray就是2

接著看performLifecycleSequence

最終執行的是handleStartActivity所以最終走到了ActivityThread的handleResumeActivity

兩點:

調用activity.performStart

調用Instrumetation.callActivityOnPostCreate

performStart方法:

調用了Instrumentation.callActivityOnStart方法:

最終到了activity的onStart方法

第二點:Instrumentation.callActivityOnPostCreate

上面主要走了cycleToPath,接著ResumeActivityItem.execute

調用了handleResumeActivity方法

handleResumeActivity最終調用performResumeActivity

調用了Instrumentation.callActivityOnResume,

到了activity.onResume()方法

參考文章: https://blog.csdn.net/u011386173/article/details/87802765

G. 怎樣在程序中設置Android應用最開始運行的Activity

從一個Activity(界面)跳轉到另一個Activity時,需要使用到Intent來啟動Activity。

Intent在android中的定義為:public Intent (Context packageContext , Class<?> cls);

在Intent使用時,分為顯式調用和隱式調用:

  1. 顯式調用---直接調用Activity的Class類

    例,Activity1調用Activity2

    Intent intent = new Intent(this , Activity2.class);

    startActivity(intent);

  2. 隱式調用---通過調用另一個Activity的action 來啟動另一個Activity

    Activity1隱式調用Activity2時需要在AndroidManifest.xml文件中配置Activity2的action和category,具體添加下面的代碼到Activity2的定義中

    <intent-filter>

    <action android:name="myaction2"/>

    <category android:name="android.intent.category.DEFAULT"/>

    <category android:name="mycategory" />

    </intent-filter>

    接著同樣用intent來啟動Activity,代碼如下:

    Intent intent = new Intent("myaction2");

    startActivity(intent);

    這樣就可以啟動Activity2

註:intent隱式調用Activity時會遇到多個Activity的intent-filter中的action和category相同時,android會先彈一個選擇界面的窗口,顯式要啟動的Activity列表,根據用戶選擇來啟動Activity,如Activity2和Activity3的action和category相同

<Activity android:name=".Activity2">

<intent-filter>

<action android:name="myaction2"/>

<category android:name="android.intent.category.DEFAULT"/>

<category android:name="myCategory" />

</intent-filter>

</Activity>

<Activity android:name=".Activity3">

<intent-filter>

<action android:name="myaction2"/>

<category android:name="android.intent.category.DEFAULT"/>

<category android:name="myCategory" />

</intent-filter>

</Activity>

啟動Activity代碼如下:

Intent intent = new("action2");

intent.addCategory("myCategory");

startActivity(intent);

這時就會彈出Acvity的選擇窗口,選擇啟動activity2還是activity3

閱讀全文

與android設置啟動activity相關的資料

熱點內容
菜鳥app的收貨地址在哪裡 瀏覽:488
伺服器配什麼顯卡 瀏覽:369
動態壁紙不動了是怎麼回事安卓 瀏覽:412
申萬宏源app哪裡看總盈利 瀏覽:133
單片機測電感電容 瀏覽:165
android在子線程中更新ui 瀏覽:694
演算法分析師面試有什麼要求 瀏覽:994
容器演算法大全圖解 瀏覽:69
cad後置命令失效 瀏覽:692
殺手阻擊存檔文件夾是哪一個 瀏覽:212
禁書pdf 瀏覽:920
沒用app語音智能提醒怎麼設置 瀏覽:502
linuxwiki安裝 瀏覽:680
隔牆演算法 瀏覽:174
安卓手機為什麼app不通知 瀏覽:550
申請雲伺服器購買費用 瀏覽:115
雲伺服器鏡像下載到本地 瀏覽:4
電腦文件夾名有橫杠 瀏覽:154
無印良品壓縮紙膜 瀏覽:753
完全隨機演算法 瀏覽:31