说明

Android的启动界面以及初次运行界面的自定义实际没有很多的技术含量,只不过是Android的activity的变样的使用,是的应用具有一种说明性质的启动界面,当然,也可以在相应的启动界面中植入广告。

要进行定义初次运行界面以及定义启动界面的时候就是需要先将初次运行界面定义完成,然后定义启动界面,将启动界面设置为应用运行首次加载的界面,然后在启动界面里通过判断应用是否是初次运行来设置是否运行初次运行界面

初次运行界面

初次运行界面我这里是通过FragmentActivity来实现的,因为要加载多张初次运行的界面,所以使用FragmentActivity来实现多个界面的集成。
首先自定义Fragment,很简单这里就不多说,直接上代码
需要注意的地方就是需要对所加载的界面进行拉伸处理,因为毕竟是项目的初次运行,所以要保证美观嘛

public class FirstRunFragment extends Fragment {
    private int img_id;
    private String text;
    private View.OnClickListener listener;

    public FirstRunFragment() {
    }

    @SuppressLint("ValidFragment")
    public FirstRunFragment(int img_id) {
        this.img_id = img_id;
        this.text = null;
    }

    @SuppressLint("ValidFragment")
    public FirstRunFragment(int img_id, View.OnClickListener listener) {
        this.img_id = img_id;
        this.listener = listener;
        this.text = null;
    }

    @SuppressLint("ValidFragment")
    public FirstRunFragment(String text) {// 后期可删除
        this.text = text;
    }

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        if (text != null) {
            TextView view = new TextView(getActivity());
            view.setLayoutParams(new ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.MATCH_PARENT));
            view.setGravity(Gravity.CENTER);
            view.setTextSize(40);
            view.setText(text);
            return view;
        }
        ImageView view = new ImageView(getActivity());
        view.setLayoutParams(new ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT));
        if (img_id != 0)
            view.setBackgroundResource(img_id);// 自动拉伸
        else
            view.setBackgroundColor(Color.WHITE);
        if (listener != null)
            view.setOnClickListener(listener);
        // view.setImageResource(img_id);//是否考虑拉伸
        return view;
    }

}

在FragmentActivity里集成Fragment,实现初次运行界面的展示,并且对运行完成之后的动作进行处理,也就是相应的跳转到登录界面等

public class FirstRun extends FragmentActivity {
    private ViewPager viewpager;
    private FragmentPagerAdapter adapter;
    private List<Fragment> fragment_list = new ArrayList<Fragment>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.start_firstrun);

        initView();
        initListener();

    }

    private void initView() {
        FirstRunFragment tab01 = new FirstRunFragment(R.drawable.bg_welcome_1);// //介绍图片
        FirstRunFragment tab02 = new FirstRunFragment(R.drawable.bg_welcome_2);
        FirstRunFragment tab03 = new FirstRunFragment(R.drawable.bg_welcome_3, new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(FirstRun.this, Login.class);
                startActivity(intent);
                finish();
            }
        });
        FirstRunFragment tab04 = new FirstRunFragment(R.color.white);// 默认终止图片(建议使用主界面截图)

        fragment_list.add(tab01);
        fragment_list.add(tab02);
        fragment_list.add(tab03);
        fragment_list.add(tab04);

        viewpager = (ViewPager) findViewById(R.id.firstrun_viewpager);
        adapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
            public int getCount() {
                return fragment_list.size();
            }

            public Fragment getItem(int arg0) {
                return fragment_list.get(arg0);
            }
        };
        viewpager.setAdapter(adapter);
        viewpager.setCurrentItem(0);
    }

    public void initListener() {
        viewpager.setOnPageChangeListener(new OnPageChangeListener() {
            public void onPageSelected(int position) {
                switch (position) {
                case 3:
                    Intent intent = new Intent(FirstRun.this, Login.class);
                    startActivity(intent);
                    finish();
                    break;
                }
            }

            public void onPageScrolled(int position, float positionOffset,
                    int positionOffsetPixels) {
            }

            public void onPageScrollStateChanged(int state) {
            }
        });
    }

}

完成了界面的展示以及加载,接下来的就是需要在启动界面里进行相应的初次判断来进行启动了,具体实现在下面进行讲述

启动界面

启动界面的设定其实是很简单的,主要就是为界面绘制一个布局,然后加载相应的布局,之后修改应用配置文件设置为默认加载的界面。然后要定义一下界面结束的时间,从而实现界面结束时跳转到其他的界面,如登录界面等。
因为我们还需要进行初次运行界面的设置,所以这里还需要对应用的初次启动状态进行判断
Android提供了SharedPreferences数据结构,可供我们存储应用的使用状态等
通过判断我们就可以来决定是都加载初次运行界面了

欢迎界面的布局文件

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/welcome_img_0"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop" />

    <ImageView
        android:id="@+id/welcome_img_1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop" />

</FrameLayout>

由于我的项目集成了即时通讯、百度地图等各种东西,所以在欢迎界面里集成了很多的初始化操作,另外因为需要与服务器的通讯,所以使用了自定义的网络加载activity,大家自己测试的时候可以没必要考虑这么多

public class Welcome extends NetActivity {
    @Bind(R.id.welcome_img_0)
    ImageView img0;
    @Bind(R.id.welcome_img_1)
    ImageView img1;

    private String name = "", pass = "";
    private String msg = "";
    private boolean need_close = false;
    private int curr_index = 0;
    private static final int[] imgs = {R.drawable.welcome_01, R.drawable.welcome_02,
            R.drawable.welcome_03, R.drawable.welcome_04,
            R.drawable.welcome_05, R.drawable.welcome_06,
            R.drawable.welcome_07};

    @Override
    public void onCreate() {
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.start_welcome);
        ButterKnife.bind(this);

        postRun();
        /*
        getMessage();
        loadFirstImg();
        startNewThread();

        new Handler().postDelayed(new Runnable() {
            public void run() {
                postRun();
            }
        }, 1000);// 时间可以慢慢调整
        */
    }

    private void postRun() {
        if (isSeriousError())
            return;
        initIP();
        UserTool.setLoginState(Welcome.this, false);// 先保存为未登录状态,然后在login中修改
        if (!UserStateTool.isLoginEver(Welcome.this)) {
            try {
                LoginSampleHelper.getInstance().initIMKitTemp();
            } catch (Exception e) {
            }
        }
        updateTimestamp();
    }

    private void initIP() {
        ServerURL.getIP();
    }

    private void loadFirstImg() {
        need_close = false;
        curr_index = (int) (Math.random() * imgs.length);
        img1.setImageResource(imgs[curr_index]);
    }

    private void loadNextImage() {
        int index = (int) (Math.random() * imgs.length);
        while (index == curr_index) {
            index = (int) (Math.random() * imgs.length);
        }
        curr_index = index;
        img0.setImageResource(imgs[curr_index]);
        //方式一通过代码的方式定义透明度动画
        Animation alphaAnimation = new AlphaAnimation((float) 1, (float) 0);
        alphaAnimation.setDuration(1000);//设置动画持续时间为3秒
        alphaAnimation.setFillAfter(true);//设置动画结束后保持当前的位置(即不返回到动画开始前的位置)
        img1.startAnimation(alphaAnimation);
    }

    private void prepareNextImg() {
        img1.setImageResource(imgs[curr_index]);
    }

    private boolean isSeriousError() {
        String value = ParamTool.getParam("serious_error");
        if (value.equals("1")) {
            Toast.makeText(this, "系统正在维护", Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(this, AboutMe.class);
            startActivity(intent);
            finish();
            return true;
        }
        return false;
    }

    private void getMessage() {
        msg = getIntent().getStringExtra("note_extra");
        if (msg == null)
            msg = "";
    }

    private void autoLogin() {
        String[] user = UserTool.getUser(this);
        name = user[0];
        pass = user[1];
        if (name.equals("") || pass.length() < 6) {// 未登录过,或者是测试的
            pass = "";
            toLoginActivity();
            return;
        }
        // 有登录记录,到login中自动登录(减少重复代码)
        startLogin();
    }

    private void toLoginActivity() {
        Intent intent = new Intent(this, Login.class);
        startActivity(intent);
        finish();
    }

    private void toMainActivity() {
        //if (!msg.equals("")) {}
        Intent intent = new Intent(this, MainMain.class);
        startActivity(intent);
        finish();
    }

    private void startLogin() {
        ConnectEasy.POSTLOGIN(this, ServerURL.LOGIN, new ConnectListener() {
            public ConnectDialog showDialog(ConnectDialog dialog) {
                return null;
            }

            public ConnectList setParam(ConnectList list) {
                list.put("appSecret", Login.APP_SECRET);
                list.put("username", name);
                list.put("password", pass);
                return list;
            }

            public void onResponse(String response) {
                loginBaiChuan(response); // 失败等都在这里面处理了
            }
        });
    }

    private void loginBaiChuan(String response) {
        String pass = MsgTool.dealResponseGetPass(response, name);
        String name = null;
        try {
            name = BaiChuanUtils.getUserName(Long.parseLong(InfoTool.getUserID(this)));
        } catch (Exception e) {
            return;
        }
        // 保存登录状态
        UserTool.setLoginState(Welcome.this, true);// 保存为登录状态
        BaiChuanUtils.login(name, pass, null);//在后台慢慢地登录去吧
        CacheTool.clearCache();//清空缓存
        //等待3秒钟,减少网络占用
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                AppUtil.dismissProgressDialog();
                toMainActivity();
            }
        }, 3000);
//        AppUtil.dismissProgressDialog();
//        if (state) {
//            toMainActivity();
//        } else {
//            BaiChuanUtils.showToast("登录失败");
//            toLoginActivity();
//        }
    }

    @Override
    protected void onDestroy() {
        need_close = true;
        System.gc();
        super.onDestroy();
    }


    @Override
    public void receiveMessage(String what) {
        if (what == null) {
            loadNextImage();
        } else {
            prepareNextImg();
        }
    }

    @Override
    public void newThread() {
        while (!need_close) {
            try {
                Thread.sleep(2000);
            } catch (Exception e) {
            }
            sendMessage(null);
            if (need_close)
                return;
            try {
                Thread.sleep(900);
            } catch (Exception e) {
            }
            sendMessage("");
        }
    }

    private void updateTimestamp() {
        StaticMethod.POST(this, ServerURL.TIME_STAMP, new ConnectListener() {
            @Override
            public ConnectList setParam(ConnectList list) {
                return null;
            }

            @Override
            public ConnectDialog showDialog(ConnectDialog dialog) {
                return null;
            }

            @Override
            public void onResponse(String response) {
                ConnectSign.dealTimeSpace(response);//内部已处理

                if (UserTool.isFirstRun(Welcome.this)) {
                    startActivity(new Intent(Welcome.this, FirstRun.class));
                    finish();
                } else {
                    autoLogin();
                }
            }
        });
    }

}

在配置文件里修改应用的默认启动界面

<activity
            android:name="com.chengmeng.start.welcome.Welcome"
            android:label="@string/app_name"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

至此,便可以实现应用的初始运行界面与欢迎界面了,供大家参考。