私は2つのアクティビティLoginActivity
とMainActivity
のアプリに取り組んでいます。ユーザーが最初にアプリを開くと、ユーザーはログインし、資格情報(ユーザー名とトークン)がPreferences
に保存されます。
これで、ユーザーがアプリを再度開くと、MainActivity
が開始されます。 Applicationクラスでこれらのアクティビティを切り替えて、LAUNCHER_ACTIVITYのインテントフィルターをマニフェストから削除しようとしましたが、機能しません。
保存された設定に基づいて、プログラムでランチャーアクティビティを切り替える方法はありますか?
要するに、デフォルトで起動されるActivity
を変更することはできません。更新:別の回答で CommonsWare で説明されている代替案があります。
ただし、妥当な回避策があります。 MainActivity
で、ユーザーがログインしているかどうかを確認し、すぐにLoginActivity
にリダイレクトできます。これには、ログイン後に自動的にMainActivity
に戻るという追加の利点があります。
または、常に最初にLoginActivity
に移動し、ユーザーがすでにログインしている場合は、それらをMainActivity
に送信する(Intent履歴を書き換えて、LoginActivity
への戻りを削除するか、 noHistory フラグをマニフェスト)。
保存された設定に基づいて、プログラムでLauncherアクティビティを切り替える方法はありますか?
あなたはこれを試すことができます:
ステップ#1:通常どおりLoginActivity
にLAUNCHER
_<intent-filter>
_を持たせ、MainActivity
に_<intent-filter>
_を持たせません。
ステップ#2: マニフェストの_<activity-alias>
_要素 が、MainActivity
_<intent-filter>
_を含むLAUNCHER
を指すようにします。
ステップ3:_Android:enabled="false"
_を_<activity-alias>
_に置くと、デフォルトで無効になるため、アプリが最初にインストールされたとき、ランチャーアイコンはLoginActivity
のみです。
ステップ#4:ユーザーがログインし、MainActivity
がランチャーアクティビティになるように変更する場合は、PackageManager
およびsetComponentEnabledSetting()
を使用して_<activity-alias>
_を作成します。有効にし、LoginActivity
を無効にします。
すべてのホーム画面がこの変更をオンザフライで検出するわけではありません。そのため、変更を反映するには、デバイスを再起動する必要があります。このため、1つのランチャーアクティビティを使用することをお勧めします。必要に応じて、そのランチャーアクティビティに_Theme.NoDisplay
_を設定し、Fahimの回答に従ってonCreate()
の正しい「実際の」アクティビティにルーティングすることができます。
最も簡単な方法は、いつものようにMainActivityランチャーアクティビティを作成することです。
次に、ユーザーがすでにログインしている場合はSharedPreferences
経由でMainActivity#onCreate(Bundle)
をチェックインし、ログインしていない場合はすぐにLoginActivity
を開始します。ユーザーがログインしたら、ユーザーがSharedPreferences
にログインしたことを示すブールフラグを保存し、MainActivity
を終了します。
アクティビティは必ずしもUIを必要としないため、マニフェストでランチャーアクティビティを使用して、必要なアクティビティを起動できます。
私の知る限り、プログラムでランチャーを変更することはできませんが、それも意味がありません。
LoginActivityのonCreate
で、ユーザー名とトークンがすでに保存されているかどうかを確認し、それで自動的にログインしようとすると、MainActivityにリダイレクトされます。アプリの動作方法に応じて、ユーザーがログインしているかどうかをチェックする変数を設定できます。ユーザーがLoginActivityである場合、再度ログインすることなくユーザーをMainActivityにリダイレクトします。
//LoginActivity
onCreate(Bundle bundle)
{
/* ... */
//Or whatever you use to login (it could also go inside a thread or an AsyncTask
if (login())
{
//Intent
Intent intent = new Intent(this, MainActivity.class);
//Start Activity
startActivity(intent);
//Finish this activity, so when user pressed back the login activity will not come forth and the app will exit
//this looks like when a user has logged in once, the login screen will not be visible to him (unless you want to)
finish();
}
}
ログインが成功した場合にのみユーザー名とトークンを保存するように設定することもできます。つまり、上記のコードは次のように変更できます。
if (getUsername() != null)
{
/* Start Main Activity */
}
これはログインを試みませんが、資格情報が少なくとも1回はログインしているため、資格情報が正しいことを認識しています。
アプリがこれらの方法とは異なる動作をする場合は、遠慮なく言ってください。詳細をお知らせできる場合があります
アプリの最初に表示したいXMLにOnCreateの後にIntentを追加するだけです。
public class LoginActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//add some code to detect if user is logged in
if (user != null){
Intent in = new Intent(LoginActivity.this, YourDesiredActivity.class);
startActivity(in);
}
..........
...........