通过调用onCreate

时间:2016-07-13 10:50:25

标签: android android-intent android-activity notifications

我正在尝试从通知中恢复活动,但它正在重新创建活动而不是恢复活动。

关于此问题的所有帖子,请提及创建PendingIntent并使用适当的标记设置此标记(如下面的代码所示),并将singleTop|singleInstance添加到AndroidManifest。

通知代码:

NotificationManager mNotifyMan = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        mNotifyMan.cancelAll();
        Notification.Builder mNB = new Notification.Builder(this);
        mNB.setOngoing(true);
        Intent intent = new Intent(parentContext, main.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
        PendingIntent pendingIntent = PendingIntent.getActivity(parentContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        mNB.setContentIntent(pendingIntent);
        mNB.setSmallIcon(R.drawable.ic_notify_icon);
        mNB.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_noti_large));
        mNB.setContentTitle(Title);
        mNB.setContentText(Message);
        mNB.setColor(0);
        mNotifyMan.notify(777, mNB.build());

我理解必须使用当前上下文传递意图。

通过onPause()上的onResume()恢复活动时,它会恢复并恢复上一个活动状态,即运行的线程计数器的值增加。

问题:

从通知中恢复时(即点击通知),将重新创建活动。我试图通过

来解决这个问题

执行onPause()时,通过基类将当前活动状态发送到通知,从而以当前状态重新创建通知。

这是我的AndroidManifest:

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

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-feature android:name="android.hardware.wifi" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:launchMode="singleInstance">

        <activity android:name="com.cynetstudios.frequencyselector.main" android:configChanges="orientation|screenSize|keyboardHidden">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name="com.cynetstudios.frequencyselector.serviceWifiFreqManager" android:exported="false"/>
    </application>

</manifest>

我可能会遗漏一些微不足道的建议吗?

5 个答案:

答案 0 :(得分:3)

您可以设置您的活动launchMode SingleTaskSingleTopSingleInstance,具体取决于您希望活动的行动方式。

如果您的活动在用户点击您的有效通知时处于打开状态,您可以稍后处理您的活动的onNewIntent方法。

此外,您需要在atcitvity中定义活动的launchMode。我编辑了你的xml。

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

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-feature android:name="android.hardware.wifi" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name="com.cynetstudios.frequencyselector.main"
            android:configChanges="orientation|screenSize|keyboardHidden"
            android:launchMode="singleInstance">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name="com.cynetstudios.frequencyselector.serviceWifiFreqManager" android:exported="false"/>
    </application>

</manifest>

我希望这对你有所帮助。

答案 1 :(得分:1)

launchMode应该在Activity部分(不是应用程序)

中使用

答案 2 :(得分:0)

尝试

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 'connect to oracle DB Dim oradb As String = "Data Source=orcl;User Id=Lucky;Password=Example;" Dim conn As New OracleConnection(oradb) conn.Open() Dim SQL As String SQL = "SELECT * FROM MyTable WHERE 1=1" 'SQL statement for 1st textbox If Not TxtName.Text = "" Then SQL = SQL & " AND USER_NAME =" & TxtName.Text End If 'SQL statement for 2nd textbox If Not TxtSurname.Text = "" Then SQL = SQL & " AND USER_SURNAME =" & TxtSurname.Text End If 'SQL statement for 3rd textbox If Not TxtAddress.Text = "" Then SQL = SQL & " AND USER_ADDRESS=" & TxtAddress.Text End If 'select SQL statements and retrieve data using ExecuteReader Dim cmd As New OracleCommand(SQL, conn) cmd.CommandType = CommandType.Text Dim dr As OracleDataReader = cmd.ExecuteReader() Dim dt As New DataTable dt.Load(dr) DataGridView1.DataSource = dt End Sub

Intent.FLAG_ACTIVITY_CLEAR_TOP

将它们设置为意图的标志

答案 3 :(得分:0)

试试这可能会对你有所帮助:

intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

并且@Alexander说将android:launchMode =“singleTop”放入活动标记

答案 4 :(得分:0)

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setClass(this, main.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
startActivity(intent);

你可以尝试这个意图。系统应用程序启动程序使用这样的意图,如果没有被杀死,它将显示(不重新创建)您的活动。