2013-05-06 18 views
5

私は起動時に起動するサービスと、手動で起動するときだけ起動するGUIの2つの主要コンポーネントを持つAndroidアプリを作成していますデバイスの起動時ではなく、アイコンを介して表示されます。私は起動時にサービスを開始する方法を知っていますが、ブート時にもGUIを起動します。これは望ましくありません。Android:起動時にサービスを開始しますが、GUIは起動しません

これは私のマニフェストの設定と関係があると推測しますが、多くのことを試していますが、ブート時にもGUIが起動しないようにする方法はわかりません。

ブート時にプログラムでGUIを起動しないようにしてください。私は、GUIのアクティビティクラス内で静的なパブリック変数を参照していますが、メソッドの呼び出しやGUIのアクティビティへのインテントの送信はしません。

ここに私のマニフェストがあります。私は間違って何をしていますか?どうもありがとうございました。

放送受信機クラスの追加
<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="my.package.name" 
     android:versionCode="0" 
     android:versionName="0.1.0"> 

    <uses-sdk 
     android:minSdkVersion="11" 
     android:targetSdkVersion="17"/> 

    <uses-permission android:name="android.permission.RECEIVE_SMS"/> 
    <uses-permission android:name="android.permission.READ_SMS"/> 
    <uses-permission android:name="android.permission.WRITE_SMS"/> 
    <uses-permission android:name="android.permission.SEND_SMS"/> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.VIBRATE" /> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" /> 
    <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" /> 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

    <application android:icon="@drawable/icon" 
       android:label="@string/app_name" 
       android:allowBackup="true" > 

     <!-- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
       I want MainActivity to only start when I 
       select its icon, NOT at boot time. However, 
       it always starts up at boot. 
      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
     --> 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/app_name" 
      android:launchMode="singleTop"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <!-- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
       MyBootReceiver properly starts up at boot time, 
       and it properly invokes MyBootService. At 
       the appropriate time, MyBootService invokes 
       RegisterActivity. 
      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
     --> 
     <activity android:name=".RegisterActivity" 
        android:label="@string/app_name"> 
     </activity> 
     <receiver 
      android:name=".MyBootReceiver" 
      android:enabled="true" 
      android:exported="false"> 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
       <category android:name="android.intent.category.DEFAULT"/> 
       <category android:name="my.package.name" /> 
      </intent-filter> 
     </receiver> 
     <service android:name=".MyBootService" /> 

    </application> 
</manifest> 

package my.package.name; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 

public class MyBootReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Intent bootIntent = new Intent(context, MyBootService.class); 
     bootIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startService(bootIntent); 
    } 
} 

サービスクラスを追加しています...

package my.package.name; 

import java.util.ArrayList; 

import android.accounts.Account; 
import android.accounts.AccountManager; 
import android.accounts.AccountManagerCallback; 
import android.accounts.AccountManagerFuture; 
import android.app.Service; 
import android.content.Context; 
import android.content.Intent; 
import android.os.IBinder; 
import android.telephony.TelephonyManager; 

public class MyBootService extends Service { 

    private static final String GOOGLE_ACCOUNT_TYPE = "com.google"; 
    private static final String GOOGLE_ACCOUNT_FEATURE = "service_ah"; 

    private Context context = null; 

    @Override 
    public IBinder onBind(Intent intent) { 
     this.display("onBind"); 
     return (null); 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
    } 

    @Override 
    public void onStart(Intent intent, int startId) { 
     super.onStart(intent, startId); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     super.onStartCommand(intent, flags, startId); 

     AccountManager am = AccountManager.get(this); 
     am.getAccountsByTypeAndFeatures(GOOGLE_ACCOUNT_TYPE, new String[]{GOOGLE_ACCOUNT_FEATURE}, 
       new AccountManagerCallback<Account[]>() { 
        @Override 
        public void run(AccountManagerFuture<Account[]> acclist) { 
         MyBootService parent = MyBootService.this; 
         Intent regIntent = new Intent(parent.getApplicationContext(), RegisterActivity.class); 
         try { 
          ArrayList<String> accountNameList = new ArrayList<String>(); 
          for (Account a: acclist.getResult()) { 
           accountNameList.add(a.name); 
          } 
          regIntent.putStringArrayListExtra("accountNames", accountNameList); 
          try { 
           TelephonyManager tmgr = (TelephonyManager) parent.getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE); 
           String phoneNo = tmgr.getLine1Number(); 
           regIntent.putExtra("phoneNumber", phoneNo); 
          } 
          catch (Throwable t) { 
          } 
         } 
         catch (Throwable t) { 
          // put error message here 
         } 
         regIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
         parent.startActivity(regIntent); 
        } 
       }, null); 

     return (START_STICKY); 
    } 

    @Override 
    public void onDestroy() { 
     this.display("onDestroy"); 
     super.onDestroy(); 
    } 
} 

MORE INFO

を私は何が起こっているのいくつかを考え出しました。まず、私のMainActivityが始まったと誤解しました。より詳細なデバッグを行うと、そののonCreate()のonResume()メソッドが呼び出されていないことがわかります。しかし、アプリのビューが表示されていた:アプリケーションの名前とデフォルトのアイコンの黒い画面。私はもともと完全起動の兆候と誤解していました。

これはもちろん、最初に起動時にそのビューが表示された理由についての質問を発生させます。私はこれについていくつかの情報を持っていますが、私はまだ何が起こっているのか混乱しています。私はonCreate() MyBootServiceによって呼び出されるRegisterActivityクラスのメソッドを削除しました。 this.getIntent()が呼び出されると、起動時にアプリケーションのビューが表示されます。 this.getIntent()がコメントアウトされている場合、アプリケーションのビューは起動時に表示されません。これはのonCreate()RegisterActivityクラスのませ MainActivityのであることを

注意。

this.getIntent()が呼び出されたときに、アプリケーションの表示が表示される原因を知っている人はいますか?

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

    // If the following line is commented out, the 
    // application's view does not show up on boot; 
    // if the following line is not commented out, 
    // the application's view shows up. 

    Intent intent = this.getIntent(); 
} 
+0

あなたの放送受信機のコードを投稿してください。あなたはあなたのレシーバーコード内でその活動の意図を作成していませんか? –

+0

'MyBootReceiver.onReceive()'は何をしますか? –

+0

ブロードキャスト受信機クラスが追加されました。 – NYCHippo

答えて

3

私は何を見ていることは、アプリの起動が速く思わせるためにアンドロイドで使用プレビューだと思います。このプレビューは、アクティビティのテーマに基づいています。

RegisterActivityのカスタムテーマを設定してください。このカスタムテーマは、最終結果とよく似ています。あなたの活動は、ダイアログである場合たとえば、あなたはシリルMottierからこのブログ記事についての詳細な情報を得ることができますTheme.DialogまたはTheme.Light.Dialog

を拡張するテーマを作成:Android App Launching Made Gorgeous


EDIT:実際に答えに変更を質問

+0

はい、ただし、RegistrationActivityは問題ではありません。 MainActivityと呼ばれる別のアクティビティです。 MainActivity内のいくつかのパブリックstatic変数はRegistrationActivity内で参照されますが、MainActivityのメソッドは呼び出されません。また、MainActivityにインテントを送信することもありません。 – NYCHippo

+0

"起動時にMyBootReceiverが適切に起動し、MyBootServiceが適切に呼び出されます。適切なタイミングでMyBootServiceがRegisterActivityを呼び出します。彼の問題は** MainActivity **の開始です。 –

+0

ありがとう、あなたの答えが鍵を提供しました。私がこれをどのように解決したかの説明については、「実際の、実際の回答」を参照してください。 – NYCHippo

0

REAL実際ANSWER

私はここで得た助けとフィードバックのために、私は最終的に私の問題を見つけ出して解決しました:

最初の場所(私のRegisterActivityクラス)でアクティビティの使用に間違っていました。私が最初にRegisterActivityに入れてGUIに関連付ける機能です。 Androidモデルの経験がなく、十分な文書が読めないため、私はアクティビティに常に関連するビューがあることを認識しませんでした。

私はこれを知ったので、以前はRegisterActivityのすべての機能がMyBootServiceに移動されたので、私は自分のアプリをリファクタリングしました。今、ブート時にビューがポップアップせず、私のアプリは私が望むことをします。

ご協力いただきありがとうございます。

関連する問題