gpt4 book ai didi

android - 关闭应用程序时屏幕开/关崩溃

转载 作者:行者123 更新时间:2023-11-29 19:15:26 25 4
gpt4 key购买 nike

我正在检测应用打开或关闭时的屏幕开启/关闭时间

使用服务和广播接收器。它在应用程序运行或最小化时运行良好,但在关闭应用程序时它会崩溃。

如何在不崩溃的情况下关闭应用程序后获取屏幕打开/关闭时间。

logcat 错误

E/ActivityThread: Activity com.shah.neeraj.s.MainActivity has leaked IntentReceiver com.shah.neeraj.s.ScreeReceiver@8686ff5 that was originally registered here. Are you missing a call to unregisterReceiver()?
android.app.IntentReceiverLeaked: Activity com.shah.neeraj.s.MainActivity has leaked IntentReceiver com.shah.neeraj.s.ScreeReceiver@8686ff5 that was originally registered here. Are you missing a call to unregisterReceiver()?
at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:1159)
at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:946)
at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1330)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1310)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1304)
at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:586)
at com.shah.neeraj.s.MainActivity.onCreate(MainActivity.java:37)
at android.app.Activity.performCreate(Activity.java:6672)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1140)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2612)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2724)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1473)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6123)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)
Application terminated.

主 Activity

public class MainActivity extends Activity {
TextView text1,text2,text3;
Date d,d1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);
text1 = (TextView) findViewById(R.id.text1);
text2 = (TextView) findViewById(R.id.text2);
text3 =(TextView) findViewById(R.id.text3);

// INITIALIZE RECEIVER
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
BroadcastReceiver mReceiver = new ScreeReceiver();
registerReceiver(mReceiver, filter);
// unregisterReceiver(mReceiver);
PowerManager pm =(PowerManager) getSystemService(Context.POWER_SERVICE);
// YOUR CODE
}

@Override
protected void onPause() {
// WHEN THE SCREEN IS ABOUT TO TURN OFF
if (ScreeReceiver.wasScreenOn)
{
//if (pm.isScreenOn() == false){
// THIS IS THE CASE WHEN ONPAUSE() IS CALLED BY THE SYSTEM DUE TO A SCREEN STATE CHANGE

d = new Date();
CharSequence s = DateFormat.format("hh:mm:ss", d.getTime());

System.out.println("SCREEN TURNED OFF");
text1.setText("SCREEN TURNED OFF" + s);
Log.i("hi", "s"+ s);
} else {
// THIS IS WHEN ONPAUSE() IS CALLED WHEN THE SCREEN STATE HAS NOT CHANGED
}
super.onPause();
}

@Override
protected void onResume() {
// ONLY WHEN SCREEN TURNS ON
if (!ScreeReceiver.wasScreenOn) {
// THIS IS WHEN ONRESUME() IS CALLED DUE TO A SCREEN STATE CHANGE

d1 = new Date();
CharSequence s1 = DateFormat.format("hh:mm:ss", d1.getTime());

text2.setText("SCREEN TURNED ON" + s1);
Log.i("hi", "s"+ s1);

System.out.println("SCREEN TURNED ON");

Timer updateTimer = new Timer();
updateTimer.schedule(new TimerTask()
{
public void run()
{
try
{
runOnUiThread(new Runnable() {
@Override
public void run() {
//stuff that updates ui
long diff = d1.getTime() - d.getTime();

int Hours = (int) (diff/( 1000* 60 * 60));
int Mins = (int) (diff/(1000*60)) % 60;

Log.i("Difference ", ""+ diff);

String diff1= Hours + ":" + Mins; // updated value every 60 second
text3.setText( diff1 );
Log.i("Differ", "diff"+ diff1);
}
});
}
catch (Exception e)
{
e.printStackTrace();
}
}
}, 0, 600000);
} else {
}
super.onResume();
}

@Override
public void onDestroy() {
super.onDestroy();
//Log.d(msg, "The onDestroy() event");
/*IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
BroadcastReceiver mReceiver = new ScreeReceiver();
unregisterReceiver(mReceive);*/
}
}

屏幕接收器

public class ScreeReceiver extends BroadcastReceiver {
public static boolean wasScreenOn = true;
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
// DO WHATEVER YOU NEED TO DO HERE
wasScreenOn = false;
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
// AND DO WHATEVER YOU NEED TO DO HERE
wasScreenOn = true;
}
Intent i = new Intent(context, UpdateService.class);
i.putExtra("screen_state", wasScreenOn);
context.startService(i);

Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
}
}

更新服务

public class UpdateService extends Service {
TextView text1,text2,text3;
@Override
public void onCreate() {
super.onCreate();
// REGISTER RECEIVER THAT HANDLES SCREEN ON AND SCREEN OFF LOGIC
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
BroadcastReceiver mReceiver = new ScreeReceiver();
registerReceiver(mReceiver, filter);
}

@Override
public void onStart(Intent intent, int startId) {
boolean screenOn = intent.getBooleanExtra("screen_state", false);
if (!screenOn) {
// YOUR CODE
/* Date d = new Date();
CharSequence s = DateFormat.format("hh:mm:ss", d.getTime());

System.out.println("SCREEN TURNED OFF");
text1.setText("SCREEN TURNED OFF" + s);
Log.i("hi", "s"+ s);
*/
Date d = new Date();
CharSequence s = DateFormat.format("hh:mm:ss", d.getTime());

System.out.println("SCREEN TURNED OFF");
Log.i("hi Service t off", "s"+ s);

// text1.setText("SCREEN TURNED OFF" + s);
System.out.println("SCREEN Off"+s);

} else {
// YOUR CODE
Date d1 = new Date();
CharSequence s1 = DateFormat.format("hh:mm:ss", d1.getTime());

//text2.setText("SCREEN TURNED ON" + s1);
Log.i("hi Service t on ", "s"+ s1);

System.out.println("SCREEN ON"+s1);
}
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}


@Override
public void onDestroy() {
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
BroadcastReceiver mReceiver = new ScreeReceiver();
unregisterReceiver(mReceiver);
}

list

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

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
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>

<receiver android:name="ScreeReceiver">

<intent-filter>
<action android:name="android.intent.action.SCREEN_OFF"/>
<action android:name="android.intent.action.SCREEN_ON"/>
</intent-filter>
</receiver>



<service android:name=".UpdateService">

</service>
</application>

</manifest>

最佳答案

你的 Logcat 返回了什么

that was originally registered here. Are you missing a call to unregisterReceiver()?

首先声明 BroadcastReceiver 作为全局 & 你应该在下面调用 onPause() 方法

然后打开这个 onCreate() 部分。

unregisterReceiver(mReceive);

最后

 @Override
protected void onStop()
{ ........................
unregisterReceiver(mReceive);
super.onStop();
}

关于android - 关闭应用程序时屏幕开/关崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43675729/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com