应用程序似乎在启动画面后在横向模式下不止一次启动?

时间:2017-05-17 10:08:06

标签: java android

我有一个启动画面,然后我的主要活动开始了。此在纵向模式下正常工作,但如果我将手机倾斜到横向模式,则可以看到主要活动在启动画面后多次启动

我尝试使用android:launchMode =" singleInstance"但在这种情况下,我无法在反馈警报框中附加文件。

以下是我的代码:

MainActivity.java

package com.example.android.tel;

import android.app.Activity;
import android.app.Dialog;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.ColorDrawable;
import android.net.Uri;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.CardView;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Window;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.crashlytics.android.Crashlytics;

import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class MainActivity extends AppCompatActivity {
    Toolbar mActionBarToolbar;
    TextView toolbar_title_mainActivity, main_textView, disclaimer_txtView;
    CardView SearchDept, SearchName, disclaimer, feedback;
    ImageView back;
    ArrayList<Uri> arrayUri = new ArrayList<Uri>();
    ArrayAdapter<Uri> myFileListAdapter;
    ListView listViewFiles;
    Dialog alertDialog;

    final int RQS_LOADIMAGE = 0;
    final int RQS_SENDEMAIL = 1;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        if (getResources().getConfiguration().orientation ==
                Configuration.ORIENTATION_PORTRAIT) {
            setContentView(R.layout.activity_main);
        } else {
            setContentView(R.layout.activity_main);
        }

        mActionBarToolbar = (Toolbar) findViewById(R.id.tool_bar_main_activity);
        toolbar_title_mainActivity = (TextView) findViewById(R.id.toolbar_title);
        main_textView = (TextView) findViewById(R.id.main_textView);
        main_textView.setPaintFlags(main_textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
        setSupportActionBar(mActionBarToolbar);
        getSupportActionBar().setDisplayShowTitleEnabled(false);
        toolbar_title_mainActivity.setText("Hry. Govt. Telephone Directory");
        back = (ImageView) findViewById(R.id.back);
        back.setVisibility(View.INVISIBLE);
        disclaimer = (CardView) findViewById(R.id.disclaimer);
        feedback = (CardView) findViewById(R.id.feedback);

        SearchDept = (CardView) findViewById(R.id.cardView1_mainActivity);
        SearchName = (CardView) findViewById(R.id.cardView2_mainActivity);
        SearchDept.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this, CardViewActivity.class);
                startActivity(i);
            }
        });

        SearchName.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent j = new Intent(MainActivity.this, ByNameListActivity.class);
                startActivity(j);
            }
        });

        disclaimer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Dialog alertDialog = new Dialog(MainActivity.this);
                alertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
                alertDialog.setContentView(R.layout.disclaimer);
                alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.WHITE));
                alertDialog.show();
            }
        });

        feedback.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 alertDialog = new Dialog(MainActivity.this);
                alertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
                alertDialog.setContentView(R.layout.feedback);
                alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.WHITE));
                alertDialog.setCanceledOnTouchOutside(true);

                ImageView send_btn=(ImageView)alertDialog.findViewById(R.id.send);
                ImageView attach_btn=(ImageView)alertDialog.findViewById(R.id.attachment);
                final TextView to_email_add=(TextView)alertDialog.findViewById(R.id.email_address);
                to_email_add.setText("tel@gmail.com");
                final EditText email_subject=(EditText)alertDialog.findViewById(R.id.email_subject);
                final EditText email_text=(EditText)alertDialog.findViewById(R.id.email_text);
                final EditText mobile_no=(EditText)alertDialog.findViewById(R.id.mobile_text);

                email_subject.setOnFocusChangeListener(new View.OnFocusChangeListener() {
                    @Override
                    public void onFocusChange(View v, boolean hasFocus) {
                        if (!hasFocus) {
                            hideKeyboard(v);
                        }
                    }
                });

                email_text.setOnFocusChangeListener(new View.OnFocusChangeListener() {
                    @Override
                    public void onFocusChange(View v, boolean hasFocus) {
                        if (!hasFocus) {
                            hideKeyboard(v);
                        }
                    }
                });

                myFileListAdapter = new ArrayAdapter<Uri>(
                        MainActivity.this,
                        android.R.layout.simple_list_item_1,
                        arrayUri);
                listViewFiles = (ListView)alertDialog.findViewById(R.id.filelist);
                listViewFiles.setAdapter(myFileListAdapter);

                listViewFiles.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
                    @Override
                    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {

                        myFileListAdapter.remove(arrayUri.get(position));
                        myFileListAdapter.notifyDataSetChanged();
                        Toast.makeText(view.getContext(), "You unattached one item", Toast.LENGTH_LONG).show();
                        return false;
                    }
                });



                attach_btn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent intent = new Intent(Intent.ACTION_PICK,
                                android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                        startActivityForResult(intent, RQS_LOADIMAGE);

                    }
                });


                send_btn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        String email_add=to_email_add.getText().toString();
                        String email_sub=email_subject.getText().toString();
                        String email_txt=email_text.getText().toString();
                        String emailAddressList[] = {email_add};
                        String mobileNo=mobile_no.getText().toString();
                        String info=email_txt+"\n\nPhone Number :"+mobileNo;


                        Intent intent = new Intent();
                        intent.putExtra(Intent.EXTRA_EMAIL, emailAddressList);
                        intent.putExtra(Intent.EXTRA_SUBJECT, email_sub);
                        intent.putExtra(Intent.EXTRA_TEXT,info);

                        if(arrayUri.isEmpty()&& isValidPhone(mobileNo)&& !(mobileNo.isEmpty())){
                            //send email without photo attached
                            intent.setAction(Intent.ACTION_SEND);
                            intent.setType("plain/text");

                            new Handler().postDelayed(new Runnable() {

                                public void run() {
                                    alertDialog.dismiss();
                                }
                            }, 5000);

                        }else if(arrayUri.size() == 1 && isValidPhone(mobileNo)&& !(mobileNo.isEmpty())){
                            //send email with ONE photo attached
                            intent.setAction(Intent.ACTION_SEND);
                            intent.putExtra(Intent.EXTRA_STREAM, arrayUri.get(0));
                            intent.setType("image/*");

                            new Handler().postDelayed(new Runnable() {

                                public void run() {
                                    alertDialog.dismiss();
                                }
                            }, 5000);

                        }else if(arrayUri.size()>1&& isValidPhone(mobileNo)&& !(mobileNo.isEmpty())){
                            //send email with MULTI photo attached
                            intent.setAction(Intent.ACTION_SEND_MULTIPLE);
                            intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, arrayUri);
                            intent.setType("image/*");

                            new Handler().postDelayed(new Runnable() {

                                public void run() {
                                    alertDialog.dismiss();
                                }
                            }, 5000);

                        }
                        else {
                            Toast.makeText(v.getContext(), "Phone number is not valid", Toast.LENGTH_LONG).show();
                        }

                        startActivity(Intent.createChooser(intent, "Please provide valid details"));

                    }
                });

                alertDialog.show();
            }
        });



    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode == RESULT_OK){
            switch(requestCode){
                case RQS_LOADIMAGE:
                    Uri imageUri = data.getData();
                    arrayUri.add(imageUri);
                    myFileListAdapter.notifyDataSetChanged();
                    break;
                case RQS_SENDEMAIL:
                    break;
            }
        }
    }

    public static boolean isValidPhone(String phone)
    {
        String expression = "^([0-9\\+]|\\(\\d{1,3}\\))[0-9\\-\\. ]{3,15}$";
        CharSequence inputString = phone;
        Pattern pattern = Pattern.compile(expression);
        Matcher matcher = pattern.matcher(inputString);
        if (matcher.matches())
        {
            return true;
        }
        else{
            return false;
        }
    }

    public void hideKeyboard(View view) {
        InputMethodManager inputMethodManager =(InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
    }

    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        int orientation;
        if (getResources().getConfiguration().orientation ==
                Configuration.ORIENTATION_PORTRAIT) {
            orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
            // or = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
        }else {
            orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
        }
        // Add code if needed
//        listViewFiles.setAdapter(myFileListAdapter);
//        myFileListAdapter.notifyDataSetChanged();
        setRequestedOrientation(orientation);
    }


}

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:weightSum="14"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_centerInParent="true"
    tools:context="com.example.android.tel.MainActivity">

    <include
        android:id="@+id/tool_bar_main_activity"
        layout="@layout/toolbar">
    </include>

    <TextView
        android:id="@+id/main_textView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.5"
        android:layout_marginTop="10dp"
        android:text="How would you like to search?"
        android:textStyle="bold"
        android:textSize="14sp"
        android:textColor="#1A237E"
        android:gravity="center_horizontal"/>

    <RelativeLayout
        android:id="@+id/searchby_btns"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="4"
        android:paddingLeft="16dp"
        android:paddingRight="16dp"
        android:gravity="center_vertical">

    <android.support.v7.widget.CardView
        android:id="@+id/cardView1_mainActivity"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_gravity="center"
        card_view:cardCornerRadius="4dp"
        android:layout_marginTop="10dp"
        card_view:cardBackgroundColor="#e97c1d">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:paddingLeft="10dp">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Search By Department.."
            android:textColor="@android:color/white"
            android:textStyle="bold"
            android:textSize="18sp"
            android:layout_centerInParent="true"/>
        </RelativeLayout>
    </android.support.v7.widget.CardView>

    <android.support.v7.widget.CardView
        android:id="@+id/cardView2_mainActivity"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_gravity="center"
        android:layout_below="@id/cardView1_mainActivity"
        card_view:cardCornerRadius="4dp"
        android:layout_marginTop="20dp"
        card_view:cardBackgroundColor="#e97c1d">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:paddingLeft="10dp">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Search By Name.."
            android:textColor="@android:color/white"
            android:textStyle="bold"
            android:textSize="18sp"
            android:layout_centerInParent="true"/>

        </RelativeLayout>

    </android.support.v7.widget.CardView>
    </RelativeLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_gravity="center"
        android:layout_weight="8.5">
    <ImageView
        android:id="@+id/map_image"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/hry_map"
        android:elevation="4dp"
        android:layout_gravity="center"/>
    </RelativeLayout>

    <RelativeLayout
        android:layout_below="@id/map_image"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:paddingRight="16dp"
        android:paddingLeft="16dp"
        android:layout_marginTop="2dp"
        android:gravity="center_horizontal"
        android:layout_alignParentBottom="true">

        <android.support.v7.widget.CardView
            android:id="@+id/disclaimer"
            android:layout_width="150dp"
            android:layout_height="30dp"
            card_view:cardCornerRadius="4dp"
            card_view:cardElevation="4dp"
            android:layout_marginRight="8dp"
            card_view:cardBackgroundColor="#424242">
            <TextView
                android:layout_width="150dp"
                android:layout_height="30dp"
                android:text="Disclaimer"
                android:gravity="center"
                android:layout_gravity="center_vertical"
                android:textColor="#FFFFFF"
                android:textStyle="bold"/>
        </android.support.v7.widget.CardView>

        <android.support.v7.widget.CardView
            android:id="@+id/feedback"
            android:layout_toRightOf="@id/disclaimer"
            android:layout_width="150dp"
            android:layout_height="30dp"
            card_view:cardCornerRadius="4dp"
            card_view:cardElevation="4dp"
            card_view:cardBackgroundColor="#424242">
            <TextView
                android:layout_width="150dp"
                android:layout_height="30dp"
                android:text="Feedback"
                android:gravity="center"
                android:layout_gravity="center_vertical"
                android:textColor="#FFFFFF"
                android:textStyle="bold"/>
        </android.support.v7.widget.CardView>

    </RelativeLayout>

</LinearLayout>

SplashScreenActivity.java

package com.example.android.telephonedirectory;

import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ProgressBar;

import com.felipecsl.gifimageview.library.GifImageView;

import org.apache.commons.io.IOUtils;

import java.io.IOException;
import java.io.InputStream;

public class SplashScreenActivity extends AppCompatActivity {
//    private GifImageView gifimageview;
    private ProgressBar progressBarSplashScreen;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getResources().getConfiguration().orientation ==
                Configuration.ORIENTATION_PORTRAIT) {
            setContentView(R.layout.activity_splash_screen);
        } else {
            setContentView(R.layout.activity_splash_screen);
        }

//        gifimageview=(GifImageView)findViewById(R.id.gifSplashscreenImage);
        progressBarSplashScreen=(ProgressBar)findViewById(R.id.progressbarSplashscreen);
        progressBarSplashScreen.setVisibility(progressBarSplashScreen.VISIBLE);

        //set GifImageView Resource

        /*try {
            InputStream inputStream=getAssets().open("splash_Screen.png");
            byte[] bytes= IOUtils.toByteArray(inputStream);
            gifimageview.setBytes(bytes);
            gifimageview.startAnimation();
        }catch (IOException ex){

        }*/

        //Wait for 4 seconds and start activity main
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                SplashScreenActivity.this.startActivity(new Intent(SplashScreenActivity.this,MainActivity.class));
                SplashScreenActivity.this.finish();
            }
        },2000);
    }

    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        int orientation;
        if (getResources().getConfiguration().orientation ==
                Configuration.ORIENTATION_PORTRAIT) {
            orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
            // or = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
        }else {
            orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
        }
        // Add code if needed
//        listViewFiles.setAdapter(myFileListAdapter);
//        myFileListAdapter.notifyDataSetChanged();
        setRequestedOrientation(orientation);
    }
}

1 个答案:

答案 0 :(得分:2)

不要使用android:launchMode="singleInstance"

启动模式,您应该使用"singleTask"

因为singleInstance为Activity创建了单独的任务堆栈,并且不检查当前任务堆栈中的活动。

"singleTask"每次检查任务堆栈中是否存在活动时都无法创建新活动。