以编程方式处理应用程序的活动堆栈

问题描述 投票:1回答:1

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

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

所有其他活动都是对该类的扩展。当我使用意图从一项活动转移到另一项活动时,它已添加到堆栈中。

并且当我移动backword活动时,弹出活动。我可以正确地将活动添加到堆栈中,但是弹出活动时出现问题。

还有我所有活动上都有Logout Button,这个按钮的OnClick我想关闭应用程序如何执行呢?任何人都知道如何在Android中处理活动堆栈。

这是我的代码。

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();

            }

        });

    }

}
android android-activity activity-stack
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.