按:之前写了几篇Jamendo的学习笔记,最近准备全面的将Jamendo完整的分析学习一遍。我将参考GaoMatrix的相关博文:http://blog.csdn.net/gaomatrix/article/category/900092。
学习并补充。
整体的文章结构将按照app的界面功能先后展开。
本讲涉及的类:SplashActivity HomeActivity,定位至activity包找到即可。
(一) App第一个Activity的定位
显然,manifest文件中,搜索关键词”MAIN”即可定位。另外,也可参考log信息,搜索“Displayed”信息,第一个显示的即为入口Activity,本App显然为SplashActivity
manifest.xml定位如下:
- <activity android:name=".activity.SplashscreenActivity" >
- <intent-filter>
- <action android:name="android.intent.action.MAIN" >
- </action>
- <category android:name="android.intent.category.LAUNCHER" >
- </category>
- </intent-filter>
- </activity>
(二) Activity风格的代码设置:无标题
代码如下:
- requestWindowFeature(Window.FEATURE_NO_TITLE);
(三) 动画的使用:新属性
AnimationUtils的使用:通过上下文(Context)和资源id加载动画
属性setFillAfter,如果设置为true,代表动画播放完毕停留在最后一帧的画面。
代码如下:
- endAnimation = AnimationUtils.loadAnimation(this, R.anim.fade_out);
- endAnimation.setFillAfter(true);//动画播放完毕,停在最后一帧
更多动画内容,参看我的动画博文:
(四) 监听
A, Dialog结束的监听
代码:
- final TutorialDialog dlg = new TutorialDialog(this);
- dlg.setOnDismissListener(new DialogInterface.OnDismissListener() {
- @Override
- public void onDismiss(DialogInterface dialog) {
- CheckBox cb = (CheckBox) dlg.findViewById(R.id.toggleFirstRun);
- if (cb != null && cb.isChecked()) {
- SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(SplashscreenActivity.this);
- prefs.edit().putBoolean(FIRST_RUN_PREFERENCE, false).commit();
- }
- int activeCount = Thread.activeCount();
- Log.d("animation", "activeCount before is:" + activeCount);
- endAnimationHandler.removeCallbacks(endAnimationRunnable);
- activeCount = Thread.activeCount();
- Log.d("animation", "activeCount after is:" + activeCount);
- endAnimationHandler.postDelayed(endAnimationRunnable, 2000);
- }
- });
- dlg.show();
B, Animation结束的监听
代码:
- endAnimation.setAnimationListener(new AnimationListener() {
- @Override
- public void onAnimationStart(Animation animation) { }
- @Override
- public void onAnimationRepeat(Animation animation) { }
- @Override
- public void onAnimationEnd(Animation animation) {
- HomeActivity.launch(SplashscreenActivity.this);
- SplashscreenActivity.this.finish();
- }
- });
(五) 初始Activity的销毁
显然,以下代码完成SplashActivity的销毁和HomeActivity的启动,代码如下:
SplashActivity中:
- @Override
- public void onAnimationEnd(Animation animation) {
- HomeActivity.launch(SplashscreenActivity.this);
- SplashscreenActivity.this.finish();
- }
HomeActivity中:
- public static void launch(Context c){
- Intent intent = new Intent(c, HomeActivity.class);
- intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP );
- c.startActivity(intent);
- }
本应用使用到了Android的加载模式(launch mode),可参看前文《安卓加载模式(Android LauncherMode)》:
http://mikewang.blog.51cto.com/3826268/708600
除了设置Intent的FLAG之外,也可以如Jamendo通过代码实现。
文档翻译地址:待完成
(六) 设置的保存
SharePreference将以键值对的形式存储我们的设置,文档中的示例代码如下:
- public class Calc extends Activity {
- public static final String PREFS_NAME = "MyPrefsFile";
- @Override
- protected void onCreate(Bundle state){
- super.onCreate(state);
- . . .
- // Restore preferences
- SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
- boolean silent = settings.getBoolean("silentMode", false);
- setSilent(silent);
- }
- @Override
- protected void onStop(){
- super.onStop();
- // We need an Editor object to make preference changes.
- // All objects are from android.context.Context
- SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
- SharedPreferences.Editor editor = settings.edit();
- editor.putBoolean("silentMode", mSilentMode);
- // Commit the edits!
- editor.commit();
- }
- }
本身实现比较简单,可参考文档学习。
(七) 自定义Dialog:
适用于显示指定内容的view,关于(About)页可使用。
定位到:TutorialDialog,核心代码:
- private final void initialize(final Context context) {
- setContentView(R.layout.tutorial);
- setTitle(R.string.tutorial_title);
- Button mCloseButton = (Button)findViewById(R.id.closeTutorial);
- if (mCloseButton != null) {
- mCloseButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- dismiss();
- }
- });
- }
- }
实际显示的应用提示如下图:
(八) 动画的显示
代码如下:
- endAnimationHandler.removeCallbacks(endAnimationRunnable);
- endAnimationHandler.postDelayed(endAnimationRunnable, 1500);
疑问:不太明白,之前并未调用callback,为什么要首先Remove掉callback,再postDelay。