起動時にアプリを起動するにはどうすればよいですか?


241

このリンクのサンプルコードを使用してみましたが、古くなって機能しません。では、Androidの起動が完了したときに、どのような変更を加え、どのファイルにアプリを自動的に起動させる必要があるのでしょうか。

回答:


315

まず、あなたの許可が必要ですAndroidManifest.xml

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

また、でAndroidManifest.xmlサービスを定義し、BOOT_COMPLETEDアクションをリッスンします。

<service android:name=".MyService" android:label="My Service">
    <intent-filter>
        <action android:name="com.myapp.MyService" />
    </intent-filter>
</service>

<receiver
    android:name=".receiver.StartMyServiceAtBootReceiver"
    android:label="StartMyServiceAtBootReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

次に、BOOT_COMPLETEDアクションを取得してサービスを開始するレシーバーを定義する必要があります。

public class StartMyServiceAtBootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
            Intent serviceIntent = new Intent(context, MyService.class);
            context.startService(serviceIntent);
        }
    }
}

これで、電話が起動したときにサービスが実行されているはずです。


8
アクティビティ:developer.android.com/guide/topics/fundamentals/activities.html サービス:developer.android.com/guide/topics/fundamentals/services.html 電話が実際に起動したときにアプリケーションを起動するには、次のことを行う必要があります。上記のようにサービスを登録し、そこでstartActivity()を使用してアプリを起動できます。ただし、ユーザーが望んでいない場合は、ユーザーの前に画面を置くことはお勧めできません。
Sean Schulte、2011年

19
Intent.ACTION_BOOT_COMPLETEDレシーバーで文字列をハードコーディングするのではなく、使用する方が良いことを追加したかっただけです。また、Intent(context, MySystemService.class)インテントを作成するときに新しいコンストラクタを使用する必要があります。
brianestey 2012

7
インテントフィルターが使用されている場合、インテントタイプをチェックする理由はありますか?
Pijusn 2013年

1
どういうわけか私Multiple markers at this line - BroadcastReceiver cannot be resolved to a type - The public type StartMyServiceAtBootReceiver must be defined in its own filepublic classラインに乗っています。何か案は?
pattyd 2013

3
MySystemServiceとは何ですか?
スポーツ14

120

これは、Androidデバイスの再起動後にアクティビティの実行を開始する方法です。

このコードをAndroidManifest.xmlファイル内の<application>要素内(要素内ではなく<activity>)に挿入します。

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<receiver
    android:enabled="true"
    android:exported="true" 
    android:name="yourpackage.yourActivityRunOnStartup"
    android:permission="android.permission.RECEIVE_BOOT_COMPLETED">

    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.intent.action.QUICKBOOT_POWERON" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>

</receiver>

次に、新しいクラスを作成しますyourActivityRunOnStartup(マニフェストの要素にandroid:name指定されたものと一致します<receiver>)。

package yourpackage;

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

public class yourActivityRunOnStartup extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
            Intent i = new Intent(context, MainActivity.class);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(i);
        }
    }

}

注:i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);アクティビティはアクティビティ外のコンテキストから起動されるため、呼び出しは重要です。これがないと、アクティビティは開始されません。

また、値android:enabledandroid:exportedおよびandroid:permission<receiver>のタグは必須ではないようです。アプリはこれらの値なしでイベントを受け取ります。こちらの例をご覧ください


ローカルサービスを作成する必要がないように、この「ショートカット」が好きです。そのコードは拡張するクラスに属していますApplicationか?たぶんonCreate()
誰かどこか

2
コードの段落は、内になければならないようだonReceive()BroadcastReceiver
誰かがどこかで

2
このコードは、BroadcastReceiverクラスを拡張する「yourActivityrRunOnStartup」アクティビティ内にあり、onReceive()メソッド内にある必要があります。
thrylos 2014年

2
私は10票を与えようとしましたが、できませんでした。申し訳ありませんが、ありがとうございました。
Sayka 2014年

1
これは私にとってはうまくいきましたが、インテントフィルターに "<action android:name =" android.intent.action.BOOT_COMPLETED "/>"が含まれている場合のみです。他の2つを使用した場合、機能しませんでした。
emhomm4 2017年

67

ACTION_BOOT_COMPLETEを聞いて、そこから必要なことを行います。ここにコードスニペットがあります。

更新:

回答の元のリンクがダウンしているので、コメントに基づいて、ここではリンクされたコードです。リンクがダウンしているときにコードを見逃すことはないからです。

AndroidManifest.xml(アプリケーション部分):

<receiver android:enabled="true" android:name=".BootUpReceiver"
        android:permission="android.permission.RECEIVE_BOOT_COMPLETED">

        <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
</receiver>

...

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

...

public class BootUpReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
                Intent i = new Intent(context, MyActivity.class);  //MyActivity can be anything which you want to start on bootup...
                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(i);  
        }

}

ソース:https : //web.archive.org/web/20150520124552/http : //www.androidsnippets.com/autostart-an-application-at-bootup


このコードが配置されているファイル:パブリッククラスBootUpReceiver extends BroadcastReceiver
Jeff Janes

うまくいきました!(android 4.0.4 APIレベル15で動作しました)。うん..それは2017年であり、私はまだAndroid 4.0.4のために開発する必要があります。:(
Luca

2
Android 8.0では動作しません!Android 4.0でも動作します。
codezombie 2017年

同じコードを使用していますが、キットカットバージョンまで機能していません。AndroidTVの起動時にアプリケーションを起動したい
Ashutosh Tripathi

@AshutoshTripathiあなたはこれを修正しましたか?
ralphgabb


2

Seanのソリューションは最初は機能しませんでした(Android 4.2.2)。同じAndroidプロジェクトにダミーアクティビティを追加し、デバイスで少なくとも1回は手動でアクティビティを実行する必要がありました。その後、Seanのソリューションが機能し始め、その後の再起動後にBroadcastReceiverに通知されました。


0

スクリーンショット

私が数日間直面していたこの質問に1つのポイントを追加したいと思います。すべての答えを試しましたが、うまくいきませんでした。Androidバージョン5.1を使用している場合は、これらの設定を変更してください。

Androidバージョン5.1を使用している場合は、アプリの設定から(起動を制限する)をオフにする必要があります。

設定>アプリ>アプリ>起動を制限(選択解除)


3
これが標準だったとは思いません。「立ち上げ制限」という言葉は聞いたことがありません。Samsung、Asus、Sonyで見たことはありません...私には意味がありません。アプリの起動しか許可されていないって?これは何を意味するのでしょうか?
驚異的な1

0

別のアプローチは、起動プロセス中の速度低下を回避するandroid.intent.action.USER_PRESENT代わりにを使用するandroid.intent.action.BOOT_COMPLETEDことです。ただし、これはtrue、ユーザーがロック画面を有効にしている場合に限られます。それ以外の場合、このインテントはブロードキャストされません。

リファレンスブログ -AndroidのACTION_USER_PRESENTインテントの問題


だから、他の言葉で、それが使用されるべきではない
behelit
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.