https://developer.android.com/guide/topics/manifest/activity-element.html
机器人:alwaysRetainTaskState
活动所在的任务的状态是否始终由系统维护 - " true"如果它会,并且"假"如果允许系统在某些情况下将任务重置为初始状态...... 此属性仅对任务的根活动有意义;所有其他活动都会被忽略。
那么root活动究竟意味着什么?
root活动是否意味着
"使用android.intent.action.MAIN
和android.intent.category.LAUNCHER
"定义的活动
或只是
"在这个确切的时刻发生在后堆栈底部的任何活动"
答案 0 :(得分:2)
一般情况是,使用from pyspark.sql import functions as f
cfg = SparkConf().setAppName('s')
spark = SparkSession.builder.enableHiveSupport().config(conf=cfg).getOrCreate()
spark.sparkContext.setLogLevel('WARN')
# matching 'parent' row, saving current 'join result' to global result(df_result)
# and return the row which maybe have 'child' row
def join_again(i, x):
global df_atom, df_result
tmp = df_atom.join(x, on=[x['id'] == df_atom['parent_atom']], how='right').cache()
# df.union is added since spark2.0, you can also use df.unionAll which is added in spark1.3
df_result = df_result.unionAll(tmp.select('id', 'parent', f.lit(i), 'order'))
# they maybe have 'child' row and should participate in 'join_again' next time
res = tmp.filter(tmp['parent_atom'].isNotNull()) \
.select(tmp['id'].alias('parent'), tmp['id_atom'].alias('id'), tmp['order'])
tmp.unpersist()
return res
def join_cycle(y):
# 'n' means how many times we execute func:'join_again'
# and 'n' is also equal to data levels (e.g. 'there are 2 levels - 0, 1, 2')
n = 1
while 1:
if y.rdd.isEmpty():
break
y = join_again(n, y)
n += 1
if __name__ == '__main__':
df = spark.createDataFrame([('222', None, '101'), ('111', None, '001'),
('333', None, '111'), ('444', None, '111'),
('555', None, '444'), ('666', None, '444')],
schema=StructType([StructField('id', StringType()),
StructField('order', StringType()),
StructField('parent', StringType())]))
df_atom = df.select(df['id'].alias('id_atom'), df['parent'].alias('parent_atom')).cache()
df_result = spark.createDataFrame([], schema=StructType([StructField('id', StringType()),
StructField('parent', StringType()),
StructField('lv', StringType()),
StructField('order', StringType())]))
# find out the row which do not have 'child' row and they are level 0
df_init = df.join(df_atom, on=[df['parent'] == df_atom['id_atom']], how='left') \
.filter(df_atom['id_atom'].isNull()).cache()
# we need to specify data level manually through func: pyspark.sql.functions.lit()
df_result = df_result.unionAll(df_init.select('parent', 'parent', f.lit(0), 'order'))
df = df_init.select('order', 'parent', 'id')
df_init.unpersist()
join_cycle(df)
df_result.distinct().show(truncate=False)
和android.intent.action.MAIN
定义的活动将是任务堆栈的根活动。
但是由于几乎没有意图标志,我们可以将任何活动作为根活动。
例如我在堆栈A-> B-> C中有三个活动,现在我想通过设置这些意图标志来启动活动D作为根活动
android.intent.category.LAUNCHER
活动D将是根活动。
FLAG_ACTIVITY_CLEAR_TASK|FLAG_ACTIVITY_NEW_TASK
:
如果在传递给Context.startActivity()的Intent中设置,则此标志将导致在活动开始之前清除与活动关联的任何现有任务。也就是说,活动成为否则为空任务的新根,并且任何旧活动都已完成。这只能与FLAG_ACTIVITY_NEW_TASK一起使用。
答案 1 :(得分:1)
我相信它位于后排的底部。
答案 2 :(得分:0)
在启动应用程序时在android中主要或根活动是要执行的第一个活动。对于root活动,必须有android.intent.action.MAIN和android.intent.category.LAUNCHER intent过滤器。
答案 3 :(得分:0)
要基于Zohra的答案,可以在AndroidManifest.xml中更改MAIN和LAUNCHER活动。要将其应用于特定活动,请在意图过滤器之间定义它们,例如:
<activity android:name=".StartActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>