当应用程序在前台 运行 使用挂起的意图或其他解决方案时,从主菜单打开特定选项卡

Open specific tab from main menu while app is running in foreground using pending intent or other solution

在我的应用程序中,首先有一个登录 activity 和一个主页 activity。在使用 volley 登录并将参数传递给 home activity 后,我能够启动一个前台服务,使应用程序 运行 在后台保持通知并返回 home activity 通过在未决意图的帮助下单击通知。

现在,我正在搜索如何从主菜单打开应用程序并直接访问主页 activity 以及前台服务的未决意图。也许我应该将待定意图的参数传递给登录 activity 并检查它们以重定向到主页 activity,但我坚持这个并且不明白。

这是登录 activity 页面:

    EditText username, password;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        Button login = (Button) findViewById(R.id.signIn);
        // Login On Button Click
        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            login();}
        });
// THIS IS THE SOLUTION THAT I THOUGHT ABOUT : if the intent is not null open HomeActivity
        Intent startinIntent = getIntent();
        if (startinIntent.getStringExtra("userLogged") != null && !startinIntent.getStringExtra("userLogged").isEmpty()) {
           String userLogged = startinIntent.getStringExtra("userLogged");
           Intent startAgain = new Intent(this, HomeActivity.class);
           tackBackWork.putExtra("userLogged", userLogged);
           startActivity(startAgain);
            Log.d("this is the ilue", userLogged);
        }
    }
    private void login(){
        username = (EditText)findViewById(R.id.username);
        password = (EditText)findViewById(R.id.password);
            RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
            JSONObject object = new JSONObject();
            try {
                //input your API parameters
                object.put("u",username.getText());
                object.put("p",password.getText());
            } catch (JSONException e) {
                e.printStackTrace();
            }
            // Enter the correct url for your api service site
            String url = getResources().getString(R.string.loginUrl);
            JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url, object,
                    new Response.Listener<JSONObject>() {
                        @Override
                        public void onResponse(JSONObject response) {
                            try{
                                String msg = response.getString("msg");
                                if(msg.contains("true")){
                                    Intent loggedIn = new Intent(LoginActivity.this, HomeActivity.class);
                                    loggedIn.putExtra("userLogged", response.toString());
                                    startActivity(loggedIn);
                                    finish();
                                }else{
                                    Toast.makeText(getApplicationContext(), "Identifiants Incorrectes", Toast.LENGTH_SHORT).show();
                                }
                            } catch (JSONException e){
                                Toast.makeText(getApplicationContext(), "erreur - 200 ", Toast.LENGTH_SHORT).show();
                            }
                        }
                    }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(getApplicationContext(), "Volley on error listener", Toast.LENGTH_SHORT).show();
                }
            });
            requestQueue.add(jsonObjectRequest);
        }
}

这里是家activity

public class HomeActivity extends AppCompatActivity implements View.OnClickListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        String userLogged = getIntent().getStringExtra("userLogged");
    }
    @Override
    protected void onStart() {
        super.onStart();
        Intent serviceIntent = new Intent(this, ForegroundServiceNoPopup.class);
        stopService(serviceIntent);
    }
    @Override
    public void onResume(){
        super.onResume();
        Intent serviceIntent = new Intent(this, ForegroundServiceNoPopup.class);
        stopService(serviceIntent);
    }
    @Override
    protected void onStop() {
        super.onStop();
        Intent serviceIntent = new Intent(this, ForegroundService.class);
        Intent intent = getIntent();
        String userLogged = intent.getStringExtra("userLogged");
        serviceIntent.putExtra("userLogged", userLogged);
        startService(serviceIntent);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Intent serviceIntent = new Intent(this, ForegroundService.class);
        Intent intent = getIntent();
        String userLogged = intent.getStringExtra("userLogged");
        serviceIntent.putExtra("userLogged", userLogged);
        startService(serviceIntent);
    }
    @Override
    protected void onPause() {
        super.onPause();
        Intent serviceIntent = new Intent(this, ForegroundService.class);
        Intent intent = getIntent();
        String userLogged = intent.getStringExtra("userLogged");
        serviceIntent.putExtra("userLogged", userLogged);
        startService(serviceIntent);
    }
}

这里是前台服务页面:

public class ForegroundService extends Service {
    @Override
    public void onCreate() {
        super.onCreate();
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        String input = intent.getStringExtra("inputExtra");
        String userLogged = intent.getStringExtra("userLogged");
        Intent backToHomeActivity = new Intent(this, HomeActivity.class);
        backToHomeActivity.putExtra("userLogged", userLogged);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, backToHomeActivity, PendingIntent.FLAG_UPDATE_CURRENT);

        Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
                .setContentTitle("Example Service")
               // .setLargeIcon()
               // .setColor()
                .setContentIntent(pendingIntent)
                .setContentText(input)
                .setSmallIcon(R.drawable.icon)
                .setContentIntent(pendingIntent)
                .setDefaults(NotificationCompat.DEFAULT_ALL)
                .setPriority(NotificationCompat.PRIORITY_MAX)
                .build();

        startForeground(1, notification);
        return START_NOT_STICKY;
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
    }
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

我对这一切都是陌生的。请帮助我。

解决方案是使用 SharedPreferences。

public class LoginActivity extends AppCompatActivity {

    Button login;
    SharedPreferences sp;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        login = (Button) findViewById(R.id.loginBtn);

        sp = getSharedPreferences("login",MODE_PRIVATE);

        if(sp.getBoolean("logged",false)){
            goToMainActivity();
        }

        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                goToMainActivity();
                sp.edit().putBoolean("logged",true).apply();
            }
        });
    }

    public void goToMainActivity(){
        Intent i = new Intent(this,MainActivity.class);
        startActivity(i);
    }
}

参见下面的教程 https://medium.com/@prakharsrivastava_219/keep-the-user-logged-in-android-app-5fb6ce29ed65