2012-12-12 43 views
1

我研究了自己的应用程序的alarmmanager和autostart。我想有一个无形的服务(这是不正确的名字,对不起),显示我周期性的敬酒(为了测试目的)。定期执行警报(自动启动)

以下代码运行但不正确。我点击 “按钮”,活动消失,但没有...

我的代码:

MainActivity 

public class MainActivity extends Activity { 

/** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Button buttonStart = (Button)findViewById(R.id.button1); 
     buttonStart.setOnClickListener(new Button.OnClickListener(){ 

    @Override 
    public void onClick(View arg0) { 
    Intent myIntent = new Intent(getBaseContext(), 
     MyScheduledReceiver.class); 

    PendingIntent pendingIntent 
    = PendingIntent.getBroadcast(getBaseContext(), 
     0, myIntent, 0); 

    AlarmManager alarmManager 
     = (AlarmManager)getSystemService(ALARM_SERVICE); 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 
    calendar.add(Calendar.SECOND, 10); 
    long interval = 60 * 10; // 
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 
     calendar.getTimeInMillis(), interval, pendingIntent); 
    finish(); 
    }}); 
    } 

} 


AutoStartNotifyReceiver 

public class AutoStartNotifyReceiver extends BroadcastReceiver { 
    private final String BOOT_COMPLETED_ACTION = "android.intent.action.BOOT_COMPLETED"; 
    public void onReceive(Context context, Intent intent) { 
     if(intent.getAction().equals(BOOT_COMPLETED_ACTION)){ 

      Intent myIntent = new Intent(context, MyScheduledReceiver.class); 
      PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,  myIntent, 0); 

      AlarmManager alarmManager =   (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
      Calendar calendar = Calendar.getInstance(); 
      calendar.setTimeInMillis(System.currentTimeMillis()); 
      calendar.add(Calendar.SECOND, 10); 
      long interval = 60 * 10; 
      alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,   calendar.getTimeInMillis(), interval, pendingIntent);   
     } 
    } 
} 

MyScheduledActivity 

public class MyScheduledActivity extends Activity { 

MediaPlayer player; 

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    //Toast.makeText(getApplicationContext(), "Eseguo onCreate",  Toast.LENGTH_LONG).show(); 
    setContentView(R.layout.activity_main); 

    player = MediaPlayer.create(this, R.raw.gabriel); 
    player.start(); 



    Toast.makeText(this, "miao",Toast.LENGTH_LONG).show(); 

} 

} 

MyScheduledReceiver 

public class MyScheduledReceiver extends BroadcastReceiver { 

public void onReceive(Context context, Intent intent) { 

Intent scheduledIntent = new Intent(context, MyScheduledActivity.class); 
scheduledIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
context.startActivity(scheduledIntent); 
} 
} 

清单:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 
<receiver android:name=".AutoStartNotifyReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED"/> 
    </intent-filter> 
</receiver> 

{12-12 14:50:21.411:E/AndroidRuntime( 865):致命例外:main 12-12 14:50:21.411:E/AndroidRuntime(865):java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.servi/com.example.servi.M​​yScheduledActivity} :java.lang.NullPointerException 12-12 14:50:21.411:E/AndroidRuntime(865):at androi d.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 12-12 14:50:21.411:E/AndroidRuntime(865):at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 12-12 14:50:21.411:E/AndroidRuntime(865):在android.app.ActivityThread.access $ 600(ActivityThread.java:123) 12-12 14:50:21.411:E/AndroidRuntime(865):at android.app .ActivityThread $ H.handleMessage(ActivityThread.java:1147) 12-12 14:50:21.411:E/AndroidRuntime(865):at android.os.Handler.dispatchMessage(Handler.java:99) 12-12 14 :50:21.411:E/AndroidRuntime(865):在android.os.Looper.loop(Looper.java:137) 12-12 14:50:21.411:E/AndroidRuntime(865):at android.app.ActivityThread .main(ActivityThread.java:4424) 12-12 14:50:21.411:E/AndroidRuntime(865):at java.lang.reflect.Method.invo keNative(Native Method) 12-12 14:50:21.411:E/AndroidRuntime(865):at java.lang.reflect.Method.invoke(Method.java:511) 12-12 14:50:21.411:E/AndroidRuntime(865):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784) 12-12 14:50:21.411:E/AndroidRuntime(865):at com.android.internal .os.ZygoteInit.main(ZygoteInit.java:551) 12-12 14:50:21.411:E/AndroidRuntime(865):at dalvik.system.NativeStart.main(Native Method) 12-12 14:50: 21.411:E/AndroidRuntime(865):引起:java.lang.NullPointerException 12-12 14:50:21.411:E/AndroidRuntime(865):at com.example.servi.M​​yScheduledActivity.onCreate(MyScheduledActivity.java:22 ) 12-12 14:50:21.411:E/AndroidRuntime(865):at android.app.Activity.performCreate(Activity.java:4465)在Android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 12-12 14:50:21.411:E/AndroidRuntime(865):at:12-12 14:50:21.411:E/AndroidRuntime(865) android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 12-12 14:50:21.411:E/AndroidRuntime(865):... 11更 }

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.servi" 
android:versionCode="1" 
android:versionName="1.0" > 

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

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="16" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.example.servi.MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

<receiver android:name=".AutoStartNotifyReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED"/> 
    </intent-filter> 
</receiver> 
<receiver android:name="MyScheduledReceiver"></receiver> 
<activity android:name="MyScheduledActivity"></activity> 
</application> 
</manifest> 

回答

1

http://www.androidsnippets.com/autostart-an-application-at-bootup

(应用部分):

<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); 
       i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       context.startActivity(i); 
     } 

} 

您可以使用定时器类使用TimerTask安排周期性任务。你也可以使用ScheduledThreadPoolExecutor类。

AlarmManager可以是一个很好的选择。警报管理器适用于您希望在特定时间运行应用程序代码的情况,即使您的应用程序当前未运行。

+0

只有现在我有时间测试代码。完美运行!谢谢!我的目标是每天2次(上午10点和晚上10点)创建通知(如敬酒)。这是使用警报管理器的最佳方式吗?你有这段代码的片段吗?谢谢! –

+0

@PolHallen,它可能会帮助你 - > http://stackoverflow.com/questions/4252907/how-to-set-a-persistent-regular-schedule-in-android –

0

清单中添加一个接收器...为您的警报收到。 就你的情况而言;

<receiver android:name=".MyScheduledReceiver"> 

</receiver> 

我希望它会解决这个问题

PS:您的活动MyScheduledActivity将被重复两次,在第二几乎每600毫秒后开始....所以不要做...增加间隔:) 或做别的检查可能打印日志或东西在AndroidManifest.xml测试

+0

的感谢!我更新了我的代码和logcat。我有nullpointerexception。也感谢600毫秒(仅用于测试)。 –