设置中在fragment中启动fragment流程及log输出

从Fragment启动另一个Fragment实现WiFi设置到高级WiFi设置的跳转
本文详细介绍了如何在Android应用中从一个Fragment(如WifiSettings)启动另一个Fragment(如AdvancedWifiSettings),通过解析日志输出信息,展示了设置类在启动、创建、暂停、重建等过程中的关键操作。此教程适用于希望实现类似功能的开发者。

转载请注明出处:http://blog.youkuaiyun.com/droyon/article/details/20069259

不当之处,敬请指正。

在设置中从一个Fragment中启动另一个fragment。

以WifiSettings启动AdvanceWifiSettings为例:



log输出:

01-02 17:44:23.860: D/Settings(15608): startPreferencePanel fragmentClass is:com.android.settings.wifi.AdvancedWifiSettings,titleText is:null
01-02 17:44:23.860: D/Settings(15608): startWithFragment111 fragmentName is:com.android.settings.wifi.AdvancedWifiSettings,resultTo is:WifiSettings{4366ab38 #0 id=0x10202f6}
01-02 17:44:23.860: D/Settings(15608): Settings onBuildStartFragmentIntent fragmentName is:com.android.settings.wifi.AdvancedWifiSettings,title is:2131427929
01-02 17:44:23.900: D/Settings(15608): Settings onPause ...
01-02 17:44:23.910: D/Settings(15608): Settings onCreate ...savedInstanceState is:null
01-02 17:44:23.910: D/Settings(15608): Settings getStartingFragmentClass is:null
01-02 17:44:23.910: D/Settings(15608): Settings getStartingFragmentClass intentClass is:com.android.settings.SubSettings
01-02 17:44:23.910: D/Settings(15608): Settings getIntent startingFragment is:null
01-02 17:44:23.940: D/Settings(15608): onContentChanged 
01-02 17:44:23.940: D/Settings(15608): onIsHidingHeaders
01-02 17:44:23.940: D/Settings(15608): Settings getStartingFragmentClass is:null
01-02 17:44:23.940: D/Settings(15608): Settings getStartingFragmentClass intentClass is:com.android.settings.SubSettings
01-02 17:44:23.940: D/Settings(15608): Settings getIntent startingFragment is:null
01-02 17:44:23.940: D/Settings(15608): Settings getStartingFragmentClass is:null
01-02 17:44:23.940: D/Settings(15608): Settings getStartingFragmentClass intentClass is:com.android.settings.SubSettings
01-02 17:44:23.940: D/Settings(15608): Settings getIntent startingFragment is:null
01-02 17:44:23.940: D/Settings(15608): Settings getStartingFragmentClass is:null
01-02 17:44:23.950: D/Settings(15608): Settings getStartingFragmentClass intentClass is:com.android.settings.SubSettings
01-02 17:44:23.950: D/Settings(15608): Settings getIntent startingFragment is:null
01-02 17:44:23.950: D/Settings(15608): Settings getStartingFragmentClass is:null
01-02 17:44:23.950: D/Settings(15608): Settings getStartingFragmentClass intentClass is:com.android.settings.SubSettings
01-02 17:44:23.950: D/Settings(15608): Settings getIntent startingFragment is:null
01-02 17:44:23.950: D/Settings(15608): Settings getStartingFragmentClass is:null
01-02 17:44:23.950: D/Settings(15608): Settings getStartingFragmentClass intentClass is:com.android.settings.SubSettings
01-02 17:44:23.950: D/Settings(15608): Settings getIntent startingFragment is:null
01-02 17:44:23.950: D/Settings(15608): switchToHeader fragmentName is:com.android.settings.wifi.AdvancedWifiSettings
01-02 17:44:23.950: D/Settings(15608): showBreadCrumbs title is:设置,shortTitle is:null
01-02 17:44:23.950: D/SubSettings(15608): Launching fragment com.android.settings.wifi.AdvancedWifiSettings
01-02 17:44:23.950: D/Settings(15608): showBreadCrumbs title is:高级 WLAN,shortTitle is:null
01-02 17:44:23.950: D/Settings(15608): showBreadCrumbs title is:高级 WLAN,shortTitle is:null
01-02 17:44:23.950: D/Settings(15608): Settings getStartingFragmentClass is:null
01-02 17:44:23.950: D/Settings(15608): Settings getStartingFragmentClass intentClass is:com.android.settings.SubSettings
01-02 17:44:23.950: D/Settings(15608): Settings getIntent startingFragment is:null
01-02 17:44:23.950: D/Settings(15608): Settings onIsMultiPane
01-02 17:44:23.950: D/Settings(15608): Settings onCreate ...isMultiPane is:false
01-02 17:44:23.950: D/Settings(15608): onIsHidingHeaders
01-02 17:44:23.960: D/Settings(15608): Settings getStartingFragmentClass is:null
01-02 17:44:23.960: D/Settings(15608): Settings getStartingFragmentClass intentClass is:com.android.settings.SubSettings
01-02 17:44:23.960: D/Settings(15608): Settings getIntent startingFragment is:null
01-02 17:44:23.960: D/Settings(15608): Settings onCreate mParentHeader is:null
01-02 17:44:23.960: D/Settings(15608): Settings onIsMultiPane
01-02 17:44:24.000: D/Settings(15608): Settings onResume ...
01-02 17:44:24.000: D/Settings(15608): invalidateHeaders
01-02 17:44:24.010: D/Settings(15608): Settings onBuildHeaders ...
01-02 17:44:24.010: D/Settings(15608): onIsHidingHeaders
01-02 17:44:24.010: D/Settings(15608): Settings getStartingFragmentClass is:null
01-02 17:44:24.010: D/Settings(15608): Settings getStartingFragmentClass intentClass is:com.android.settings.SubSettings
01-02 17:44:24.010: D/Settings(15608): Settings getIntent startingFragment is:null
01-02 17:44:24.010: D/Settings(15608): onGetNewHeader
01-02 17:44:24.510: D/Settings(15608): onStop 


<think>我们被要求提供在Activity和Fragment输出打开或关闭日志的代码示例。根据Android的生命周期,我们可以通过重写生命周期方法并添加日志打印来实现。 对于Activity,我们关注以下生命周期方法: - onCreate: 当Activity被创建时调用,可以在此输出Activity启动的日志。 - onStart: 当Activity变为可见时调用。 - onResume: 当Activity开始与用户交互时调用。 - onPause: 当Activity失去焦点但仍可见时调用。 - onStop: 当Activity不再可见时调用。 - onDestroy: 当Activity被销毁时调用,可以在此输出Activity关闭的日志。 通常,我们可能关心Activity的创建和销毁(onCreate和onDestroy)以及可见性变化(onStart和onStop)。但为了全面,我们可以选择多个方法。 对于Fragment,也有类似的生命周期方法: - onAttach: 当Fragment与Activity关联时。 - onCreate: Fragment创建时。 - onCreateView: 创建Fragment的视图时。 - onViewCreated: 在onCreateView之后调用。 - onStart: 当Fragment可见时。 - onResume: 当Fragment开始交互时。 - onPause: 失去交互时。 - onStop: 不可见时。 - onDestroyView: 销毁视图时。 - onDestroy: Fragment销毁时。 - onDetach: 与Activity解除关联时。 同样,我们可以选择在onCreate(或onCreateView)和onDestroy(或onDestroyView)中输出打开和关闭的日志。 根据引用[2]和[4],我们知道Activity和Fragment的生命周期是开发中的重点,因此正确输出日志有助于调试。 下面分别给出Activity和Fragment的日志输出代码示例。 ### Activity中输出日志的示例 在Activity中,我们可以这样添加日志: ```java public class MyActivity extends AppCompatActivity { private static final String TAG = "MyActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d(TAG, "Activity created"); // 输出创建日志 } @Override protected void onStart() { super.onStart(); Log.d(TAG, "Activity started (visible)"); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "Activity resumed (interactive)"); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "Activity paused"); } @Override protected void onStop() { super.onStop(); Log.d(TAG, "Activity stopped (invisible)"); } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "Activity destroyed"); // 输出销毁日志 } } ``` ### Fragment输出日志的示例 在Fragment中,我们可以这样添加日志: ```java public class MyFragment extends Fragment { private static final String TAG = "MyFragment"; @Override public void onAttach(Context context) { super.onAttach(context); Log.d(TAG, "Fragment attached to activity"); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "Fragment created"); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.d(TAG, "Fragment onCreateView"); return inflater.inflate(R.layout.fragment_my, container, false); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); Log.d(TAG, "Fragment view created"); } @Override public void onStart() { super.onStart(); Log.d(TAG, "Fragment started (visible)"); } @Override public void onResume() { super.onResume(); Log.d(TAG, "Fragment resumed (interactive)"); } @Override public void onPause() { super.onPause(); Log.d(TAG, "Fragment paused"); } @Override public void onStop() { super.onStop(); Log.d(TAG, "Fragment stopped (invisible)"); } @Override public void onDestroyView() { super.onDestroyView(); Log.d(TAG, "Fragment view destroyed"); // 注意:在Fragment中,onDestroyView是视图被销毁时调用,此时Fragment可能并未被销毁(比如在返回栈中) } @Override public void onDestroy() { super.onDestroy(); Log.d(TAG, "Fragment destroyed"); } @Override public void onDetach() { super.onDetach(); Log.d(TAG, "Fragment detached from activity"); } } ``` 注意:在Fragment中,我们通常会将视图相关的初始化放在onCreateView中,而视图销毁则在onDestroyView中。因此,如果我们把“打开”理解为视图的创建,那么可以在onCreateView或onViewCreated中输出;而“关闭”如果是指视图的销毁,则可以在onDestroyView中输出。但请注意,Fragment的生命周期比Activity复杂,一个Fragment可能在不可见时(比如被加入返回栈)只销毁视图而不销毁Fragment实例,所以我们需要根据实际需求选择打印日志的位置。 以上代码示例可以满足在Activity和Fragment输出打开或关闭日志的需求。 根据引用[4],我们还可以通过adb命令来测量Activity的启动时间,但是这里我们关注的是在代码中输出日志。 ### 相关问题 §§相关问题§§ 1. 如何配置Android Studio的Logcat以便更好地查看生命周期日志? 2. 在Fragment中,onDestroyView和onDestroy分别在什么场景下调用? 3. 如何避免在Activity和Fragment的生命周期方法中产生内存泄漏? 4. 除了日志打印,还有哪些方法可以跟踪Activity和Fragment的生命周期? </think>以下是Android中Activity和Fragment输出打开/关闭日志的完整代码实现: ### Activity生命周期日志实现 ```java public class MainActivity extends AppCompatActivity { private static final String TAG = "ActivityLifecycle"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.i(TAG, "Activity Created: " + getLocalClassName()); } @Override protected void onStart() { super.onStart(); Log.i(TAG, "Activity Started: " + getLocalClassName()); } @Override protected void onResume() { super.onResume(); Log.i(TAG, "Activity Resumed: " + getLocalClassName()); } @Override protected void onPause() { super.onPause(); Log.i(TAG, "Activity Paused: " + getLocalClassName()); } @Override protected void onStop() { super.onStop(); Log.i(TAG, "Activity Stopped: " + getLocalClassName()); } @Override protected void onDestroy() { super.onDestroy(); Log.i(TAG, "Activity Destroyed: " + getLocalClassName()); } } ``` ### Fragment生命周期日志实现 ```java public class MyFragment extends Fragment { private static final String TAG = "FragmentLifecycle"; @Override public void onAttach(Context context) { super.onAttach(context); Log.i(TAG, "Fragment Attached: " + getClass().getSimpleName()); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i(TAG, "Fragment Created: " + getClass().getSimpleName()); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.i(TAG, "Fragment View Created: " + getClass().getSimpleName()); return inflater.inflate(R.layout.fragment_layout, container, false); } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); Log.i(TAG, "Fragment View Ready: " + getClass().getSimpleName()); } @Override public void onStart() { super.onStart(); Log.i(TAG, "Fragment Started: " + getClass().getSimpleName()); } @Override public void onResume() { super.onResume(); Log.i(TAG, "Fragment Resumed: " + getClass().getSimpleName()); } @Override public void onPause() { super.onPause(); Log.i(TAG, "Fragment Paused: " + getClass().getSimpleName()); } @Override public void onStop() { super.onStop(); Log.i(TAG, "Fragment Stopped: " + getClass().getSimpleName()); } @Override public void onDestroyView() { super.onDestroyView(); Log.i(TAG, "Fragment View Destroyed: " + getClass().getSimpleName()); } @Override public void onDestroy() { super.onDestroy(); Log.i(TAG, "Fragment Destroyed: " + getClass().getSimpleName()); } @Override public void onDetach() { super.onDetach(); Log.i(TAG, "Fragment Detached: " + getClass().getSimpleName()); } } ``` ### 日志输出示例 ``` I/ActivityLifecycle: Activity Created: MainActivity I/ActivityLifecycle: Activity Started: MainActivity I/ActivityLifecycle: Activity Resumed: MainActivity I/FragmentLifecycle: Fragment Attached: MyFragment I/FragmentLifecycle: Fragment Created: MyFragment I/FragmentLifecycle: Fragment View Created: MyFragment I/FragmentLifecycle: Fragment View Ready: MyFragment I/FragmentLifecycle: Fragment Started: MyFragment I/FragmentLifecycle: Fragment Resumed: MyFragment I/FragmentLifecycle: Fragment Paused: MyFragment I/FragmentLifecycle: Fragment Stopped: MyFragment I/FragmentLifecycle: Fragment View Destroyed: MyFragment I/FragmentLifecycle: Fragment Destroyed: MyFragment I/FragmentLifecycle: Fragment Detached: MyFragment I/ActivityLifecycle: Activity Paused: MainActivity I/ActivityLifecycle: Activity Stopped: MainActivity I/ActivityLifecycle: Activity Destroyed: MainActivity ``` ### 关键说明: 1. **日志级别选择**: - 使用`Log.i()`(INFO级别)记录生命周期事件 - 包含类名标识确保日志来源明确 2. **完整生命周期覆盖**: - Activity:覆盖onCreate→onDestroy全过程[^1] - Fragment:覆盖onAttach→onDetach完整过程[^2] 3. **实用技巧**: ```java // 在任意位置获取当前显示的Activity public static Activity getCurrentActivity() { return MyApplication.getInstance().getCurrentActivity(); } // 在Application中跟踪当前Activity public void registerActivityLifecycleCallbacks( new ActivityLifecycleCallbacks() { @Override public void onActivityResumed(Activity activity) { currentActivity = activity; } } ); ``` 4. **进阶监控工具**: ```gradle // build.gradle 添加性能监控库 implementation 'androidx.tracing:tracing-ktx:1.1.0' ``` ### 生命周期关系图示 $$ \begin{array}{c} \text{Activity生命周期} \\ \begin{array}{cccccccc} \text{onCreate} & \rightarrow & \text{onStart} & \rightarrow & \text{onResume} \\ \downarrow & & \downarrow & & \downarrow \\ \text{onDestroy} & \leftarrow & \text{onStop} & \leftarrow & \text{onPause} \\ \end{array} \\ \\ \text{Fragment生命周期} \\ \begin{array}{cccccccc} \text{onAttach} & \rightarrow & \text{onCreate} & \rightarrow & \text{onCreateView} \\ \downarrow & & \downarrow & & \downarrow \\ \text{onDetach} & \leftarrow & \text{onDestroy} & \leftarrow & \text{onDestroyView} \\ \end{array} \end{array} $$ ### 性能优化提示: 使用`adb`命令测量启动时间: ```bash adb shell am start-activity -W com.example/.MainActivity ``` 输出结果包含`TotalTime`字段表示完整启动时间[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hailushijie

您的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值