android - 以编程方式通过应用程序处理 Activity 堆栈

标签 android android-activity activity-stack

我的应用程序中有四个 Activity A-->B-->C-->D。

我写了一个扩展 Activity 类的我自己的类 MyActivity。我写这个类来处理 Activity 堆栈。这个类有两个方法 addActivitiyTostack() 和 getActivityFromStack() 我使用堆栈来存储 Activity 。

所有其他 Activity 都扩展了此类。 当我使用 Intent 从一项 Activity 转移到另一项 Activity 时,它会添加到堆栈中。

当我移动后退词时, Activity 会弹出。 我可以正确地将 Activity 添加到堆栈,但我在弹出 Activity 时遇到问题。

另外,我在所有 Activity 上都有注销按钮,这个按钮的 OnClick 我想关闭应用程序如何实现呢?任何人都知道如何在 Android 中处理 Activity 堆栈。

这是我的代码。

package com.example.iprotect;

import java.util.Enumeration;
import java.util.Stack;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class MyActivity extends Activity {

    private static Stack<Activity> stack = new Stack<Activity>();
    static int top=0;

    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        addActivityToStack(this);
    }


    public static void addActivityToStack(MyActivity myActivity) {
        // TODO Auto-generated method stub
        stack.push(myActivity);
        for (int i =0; i< stack.size() ; i++) {
            Activity act=stack.get(i);
            Log.i("Element in stack", ""+act);
        }
    }


    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        //getActivityFromStack();
        //logoutFromApplication();

    }


    public static void logoutFromApplication() {
        // TODO Auto-generated method stub
        Enumeration<Activity> enm=stack.elements();

        while(enm.hasMoreElements())
        {
            Activity act=enm.nextElement();
            stack.pop();
        }

    }


    public static Activity getActivityFromStack() {
        return stack.pop();
    }

}

A-->

public class WebServiceActivity extends MyActivity{

    EditText editText1, editText2;
    Button button;
    String response = "";
    String email, password;

    public final Pattern EMAIL_ADDRESS_PATTERN = Pattern
            .compile(".+@.+\\.[a-z]+");

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final EditText editText1 = (EditText) findViewById(R.id.etEmail);
        final EditText editText2 = (EditText) findViewById(R.id.etPassword);

        button = (Button) findViewById(R.id.loginButton);
        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if (TextUtils.isEmpty(editText1.getText().toString())) {
                    Toast.makeText(getApplicationContext(),
                            "please enter email id", Toast.LENGTH_SHORT).show();
                } else if (TextUtils.isEmpty(editText2.getText().toString())) {

                    Toast.makeText(getApplicationContext(),
                            "please enter passwod", Toast.LENGTH_SHORT).show();
                } else {
                    Boolean bool = EMAIL_ADDRESS_PATTERN.matcher(
                            editText1.getText().toString()).matches();
                    if (bool == true) {

                    } else {
                        Toast.makeText(getApplicationContext(),
                                "Invalid email id", Toast.LENGTH_SHORT).show();
                    }

                    email = editText1.getText().toString();
                    password = editText2.getText().toString();
                    // final ProgressDialog pd = ProgressDialog.show(
                    // WebServiceActivity.this, "Calling webservice...",

                    // "Please wait...", true, false);

                    final ProgressBar bar = (ProgressBar) findViewById(R.id.progressBar2);
                    bar.setVisibility(View.VISIBLE);

                    new AsyncTask<Void, Void, Void>() {
                        String r;

                        protected void onPreExecute() {
                        };

                        @Override
                        protected Void doInBackground(Void... params) {
                            r = invokeWebService();

                            return null;
                        };

                        protected void onPostExecute(Void result) {
                            bar.setVisibility(View.VISIBLE);

                        };

                    }.execute();

                }
            }

            private String invokeWebService() {
                String response = "";
                try {
                    WebService webService = new WebService(
                            "http://sphinx-solution.com/iProtect/api.php?");
                    Map<String, String> params = new HashMap<String, String>();
                    params.put("action", "auth");
                    params.put("email", email);
                    params.put("password", password);
                    response = webService.WebGet("auth", params);

                    JSONObject jsonObject = new JSONObject(response);
                    String rr = jsonObject.optString("status");

                    if (TextUtils.equals(rr, "success")) {
                        Log.e("MSG", "status==success");
                        Intent intent = new Intent(WebServiceActivity.this,
                                SecondActivity.class);
                        //MyActivity.addActivityToStack(WebServiceActivity.this);
                        intent.putExtra("email", email);
                        intent.putExtra("password", password);
                        WebServiceActivity.this.startActivity(intent);
                        finish();

                    } else {
                        Log.e("MSG", "status ==failed");

                    }

                } catch (Exception e) {
                    e.printStackTrace();
                }
                return response;
            }
        });
    }
}

B-->

public class SecondActivity extends MyActivity {

    ListView listView;
    String email1, password1;
    ArrayList<JSONStructure> arrayList = new ArrayList<JSONStructure>();
    String r;
    String r1;
    String tablename;
    String rows;
    JSONObject jsonObject;
    String tablename2;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_layout);

        Intent intent = getIntent();
        email1 = intent.getExtras().getString("email");
        password1 = intent.getExtras().getString("password");

        Button btn1 = (Button) findViewById(R.id.refreshbutton);
        btn1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                final ProgressDialog pd = ProgressDialog.show(
                        SecondActivity.this, "Refresh List...",
                        "Please wait...", true, false);

                new AsyncTask<Void, Void, Void>() {

                    @Override
                    protected Void doInBackground(Void... params) {
                        pd.dismiss();
                        r = invokeWebService();
                        return null;
                    }

                    protected void onPostExecute(Void result) {
                    };

                }.execute();

            }
        });

        Button btn = (Button) findViewById(R.id.logoutbutton);

        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                final ProgressDialog pd = ProgressDialog.show(
                        SecondActivity.this, "Calling webservice...",
                        "Please wait...", true, false);

                new AsyncTask<Void, Void, Void>() {

                    @Override
                    protected Void doInBackground(Void... params) {
                        pd.dismiss();
                        return null;
                    }

                    @Override
                    protected void onPostExecute(Void result) {
                        Intent intent = new Intent(SecondActivity.this,
                                WebServiceActivity.class);
                        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        SecondActivity.this.startActivity(intent);

                    }

                }.execute();

            }

        });

        listView = (ListView) findViewById(R.id.listview1);

        listView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view,
                    int position, long id) {

                JSONStructure jsonstructure = (JSONStructure) listView
                        .getAdapter().getItem(position);

                final String tablename1 = jsonstructure.getTableName()
                        .toString();

                Intent intent = new Intent(SecondActivity.this,
                        ProgressBarActivity.class);
                //MyActivity.addActivityToStack(SecondActivity.this);

                intent.putExtra("tablename", tablename1);
                intent.putExtra("Rows", rows);
                intent.putExtra("email", email1);
                intent.putExtra("password", password1);

                SecondActivity.this.startActivity(intent);

            }

        });

        new AsyncTask<Void, Void, Void>() {

            @Override
            protected void onPreExecute() {

                super.onPreExecute();
            }

            @Override
            protected Void doInBackground(Void... params) {
                r = invokeWebService();

                try {
                    JSONArray jsonArray = new JSONArray();
                    JSONObject jsonObject = new JSONObject(r);
                    jsonArray = jsonObject.getJSONArray("Records");

                    for (int i = 0; i < jsonArray.length(); i++) {
                        JSONObject c = jsonArray.getJSONObject(i);
                        tablename = c.optString("TABLE NAME");
                        rows = c.optString("Rows");
                        JSONStructure jsonStructure = new JSONStructure();
                        jsonStructure.setTableName(tablename);
                        jsonStructure.setRows(rows);
                        arrayList.add(jsonStructure);
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                }

                return null;

            }

            @Override
            protected void onPostExecute(Void result) {
                if (arrayList != null && arrayList.size() > 0) {

                    MyAdapter adapter = new MyAdapter(SecondActivity.this,
                            arrayList);
                    listView.setAdapter(adapter);
                }
            }

        }.execute();

    }

    private String invokeWebService() {
        String response = "";
        try {
            WebService webService = new WebService(
                    "http://sphinx-solution.com/iProtect/api.php?");
            Map<String, String> params = new HashMap<String, String>();
            params.put("action", "getTables");
            params.put("email", email1);
            params.put("password", password1);
            response = webService.WebGet("getTables", params);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return response;
    }

}

C-->

public class ThirdActivity extends MyActivity {
    String tablename1, row1, json1;
    ArrayList<JSONStructure> arrayList = new ArrayList<JSONStructure>();

    JSONArray jsonArray, jsonArray2;
    JSONObject jsonObject;
    String row;
    String email1, password1;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.third_layout);

        ListView listView = (ListView) findViewById(R.id.listview2);

        TextView textView = (TextView) findViewById(R.id.title_textview);

        Intent intent = getIntent();
        tablename1 = intent.getExtras().getString("tablename");
        row = intent.getExtras().getString("Rows");
        textView.setText(tablename1);
        json1 = intent.getExtras().getString("Json");
        email1 = intent.getExtras().getString("email");
        password1 = intent.getExtras().getString("password");

        new AsyncTask<Void, Void, Void>() {

            @Override
            protected Void doInBackground(Void... params) {

                return null;
            }

            @Override
            protected void onPostExecute(Void result) {

                Button button = (Button) findViewById(R.id.goback);
                button.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {

                        Intent intent = new Intent(ThirdActivity.this,
                                SecondActivity.class);
                        MyActivity.getActivityFromStack();
                        intent.putExtra("email", email1);
                        intent.putExtra("password", password1);
                        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        ThirdActivity.this.startActivity(intent);

                    }
                });

            }

        }.execute();

        listView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> adapterView, View view,
                    final int position, long id) {
                final ProgressDialog pd = ProgressDialog.show(
                        ThirdActivity.this, "Calling webservice...",
                        "Please wait...", true, false);

                new AsyncTask<Void, Void, Void>() {

                    @Override
                    protected Void doInBackground(Void... paramArrayOfParams) {

                        pd.dismiss();

                        try {

                            jsonObject = new JSONObject(json1);

                        } catch (Exception e) {
                            e.printStackTrace();
                        }

                        return null;
                    }

                    @Override
                    protected void onPostExecute(Void result) {
                        Intent intent = new Intent(ThirdActivity.this,
                                FinalActivity.class);
                        //MyActivity.addActivityToStack(ThirdActivity.this);
                        intent.putExtra("tablename", tablename1);
                        intent.putExtra("Json", jsonObject.toString());
                        intent.putExtra("Row", position);
                        intent.putExtra("email", email1);
                        intent.putExtra("password", password1);
                        ThirdActivity.this.startActivity(intent);

                    }

                }.execute();

            }

        });

        try {

            JSONObject jsonObject = new JSONObject(json1);
            JSONArray jsonArray = new JSONArray();
            jsonArray = jsonObject.getJSONArray("FirstThree");
            jsonArray2 = jsonObject.getJSONArray("Color");

            for (int i = 0; i < jsonArray.length(); i++) {

                JSONObject c = jsonArray.getJSONObject(i);
                String one = c.optString("One");
                String two = c.optString("Two");
                String three = c.optString("Three");

                JSONObject c1 = jsonArray2.getJSONObject(i);

                String color = c1.optString("color");

                JSONStructure jsonStructure = new JSONStructure();
                jsonStructure.column1 = one;
                jsonStructure.column2 = two;
                jsonStructure.column3 = three;
                jsonStructure.setColumn1(one);
                jsonStructure.setColumn2(two);
                jsonStructure.setColumn3(three);
                jsonStructure.setColor(color);

                arrayList.add(jsonStructure);
                Log.e("one", c.optString("One"));
                Log.e("two", c.optString("Two"));
                Log.e("three", c.optString("Three"));
                Log.e("color", c1.optString("color"));

            }

        } catch (Exception e) {
            e.printStackTrace();

        }

        if (arrayList != null && arrayList.size() > 0) {

            MyAdapter1 adapter1 = new MyAdapter1(ThirdActivity.this, arrayList);
            listView.setAdapter(adapter1);

        }

        Button btn = (Button) findViewById(R.id.logoutbutton);

        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                final ProgressDialog pd = ProgressDialog.show(
                        ThirdActivity.this, "Calling webservice...",
                        "Please wait...", true, false);

                new AsyncTask<Void, Void, Void>() {

                    @Override
                    protected Void doInBackground(Void... params) {
                        pd.dismiss();
                        return null;
                    }

                    @Override
                    protected void onPostExecute(Void result) {
                        Intent intent = new Intent(ThirdActivity.this,
                                WebServiceActivity.class);
                        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        ThirdActivity.this.startActivity(intent);
                        super.onPostExecute(result);
                    }

                }.execute();

            }

        });

    }

}

最佳答案

假设您只需要此堆栈用于注销功能,则有更好的方法。请改用广播。在 MyActivity.onCreate 中注册一个 BroadcastReceiver。接收者应该只调用 Activity 的 finish()。从按钮的点击监听器发送广播(btn1?那个按钮有什么作用?无法从名称中猜出;需要更好的名称;))。就是这样。

关于android - 以编程方式通过应用程序处理 Activity 堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12562841/

相关文章:

android - 无法在索引处绑定(bind)参数,因为索引超出范围

android - 如何始终在 Bottom Sheet 对话框 fragment 中将按钮与屏幕底部对齐

android - 如何根据某些操作从 Activity 堆栈中删除特定 Activity/Activity ?

android - 当应用程序从低内存中返回时系统重新创建 fragment

android - 使用 Google 的 ImageWorker 在 ListView 中加载图像导致 java.lang.RuntimeException

java - 如何在android中创建图像按钮?

可绑定(bind)的Android前台服务

android - 在 Android 应用程序中显示 Assets 文件夹中的 excel 文件

android - 当子 Activity 关闭时更新 Activity