2017-09-10 6 views
0

의도를 사용하여 onStartJob 방법의 URL을 Service으로 열려고합니다. 아래는 코드입니다JobScheduler의 onStartJob에서 ACTION_VIEW 의도로 URL을 여는 방법

MainActivity

package com.rohitkhatri.jobscheduler; 

import android.app.job.JobInfo; 
import android.app.job.JobScheduler; 
import android.content.ComponentName; 
import android.content.Context; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.Toast; 

import com.rohitkhatri.jobscheduler.MyService; 

public class MainActivity extends AppCompatActivity { 
    final int JOB_ID = 101; 
    JobScheduler jobScheduler; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE); 

     scheduleJob(); 
    } 

    public void scheduleJob() { 
     ComponentName componentName = new ComponentName(this, MyService.class); 
     JobInfo.Builder jobInfo = new JobInfo.Builder(JOB_ID, componentName); 
     jobInfo.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY); 

     int response = jobScheduler.schedule(jobInfo.build()); 

     if (response == JobScheduler.RESULT_FAILURE) { 
      Toast.makeText(this, "Something went wrong", Toast.LENGTH_LONG).show(); 
     } 
    } 
} 

이면 MyService

package com.rohitkhatri.jobscheduler; 

import android.app.job.JobService; 
import android.content.Intent; 
import android.net.Uri; 
import android.widget.Toast; 

public class MyService extends JobService { 
    @Override 
    public boolean onStartJob(JobParameters jobParameters) { 
     Toast.makeText(this, "Job executed", Toast.LENGTH_SHORT).show(); 

     Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://google.com")); 
     startActivity(intent); 
     return false; 
    } 

    @Override 
    public boolean onStopJob(JobParameters jobParameters) { 
     Toast.makeText(this, "Job Stopped", Toast.LENGTH_SHORT).show(); 
     return false; 
    } 
} 

AndroidManifest를

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.rohitkhatri.jobscheduler"> 

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

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:roundIcon="@mipmap/ic_launcher_round" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <service android:name=".MyService" 
      android:permission="android.permission.BIND_JOB_SERVICE" 
      android:enabled="true" 
      android:exported="true"/> 
    </application> 

</manifest> 

그러나 나는 다음과 같은 오류 받고 있어요 :

09-30 20:57:31.486 30106-30106/com.rohitkhatri.jobscheduler E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.rohitkhatri.jobscheduler, PID: 30106 
java.lang.RuntimeException: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want? 
    at android.app.job.JobService$JobHandler.handleMessage(JobService.java:130) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5443) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want? 
    at android.app.ContextImpl.startActivity(ContextImpl.java:672) 
    at android.app.ContextImpl.startActivity(ContextImpl.java:659) 
    at android.content.ContextWrapper.startActivity(ContextWrapper.java:331) 
    at com.rohitkhatri.jobscheduler.MyService.onStartJob(MyService.java:23) 
    at android.app.job.JobService$JobHandler.handleMessage(JobService.java:126) 
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:148)  
    at android.app.ActivityThread.main(ActivityThread.java:5443)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)  
012 위에서 언급 한 바와 같이 3,516,
+0

"JobScheduler 서비스의 onStartJob 메소드에서 ACTION_VIEW 인 텐트를 사용하여 브라우저에서 URL을 열려고합니다."- 왜 사용자가 이것을 원하니? 작업이 호출되는 시점을 구체적으로 제어 할 수 없기 때문에 사용자가 중요한 작업을 수행하는 중일 수 있습니다. 백그라운드에서 이벤트에 대해 사용자에게 알리고 싶다면 '알림'을 사용하십시오. – CommonsWare

+0

알아,하지만 그건 내 목적 때문이야. 나는이 애플 리케이션을 배포하지 않을 것이다, 내 요구 사항을 충족하기 위해 내 휴대폰에만 설치됩니다. –

답변

2

당신은, 그것은 어디 선가 UI를 시작하기 끔찍한 UX는 사용자가 무엇이든 중단,의 활동 상황

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://google.com")); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent); 
+0

고맙습니다. 내 문제를 해결했습니다 :-) –

0

외부에서 startActivity를()를 호출하기 위해 FLAG_ACTIVITY_NEW_TASK 플래그를 설정해야합니다 어쩌면 그들에게 사물을 잘못 접촉하게 만들 수도 있습니다. 대신 적절한 알림을 게시해야합니다.