Terminate Restart
A robust Flutter plugin for terminating and restarting your app with extensive customization options. Perfect for implementing dynamic updates, clearing app state, or refreshing your app's UI.
Demo
Plugin in Action
Clean & Simple Interface
Features
-
Three Restart Modes:
-
UI-only Restart: (~200ms)
- Recreates activities/views while maintaining connections
- Perfect for theme changes, language switches
- Preserves network connections and background tasks
- Faster execution with minimal disruption
-
Full Process Restart: (~800ms)
- Complete app termination and restart
- Ideal for updates, security-related changes
- Cleans up all resources and states
- Ensures fresh start with no residual state
-
With Confirmation Dialog: (+50ms)
- Shows a customizable confirmation dialog
- User can choose to proceed or cancel
- Supports both UI-only and full restart
- Perfect for user-initiated actions
-
-
Smart Data Management:
- Configurable data clearing during restart
- Granular control over data preservation
- Secure handling of sensitive information
-
Security Features:
- Optional keychain data preservation
- Secure user defaults handling
- Clean process termination
-
Platform Support:
- Android: Full support with activity recreation
- iOS: Compliant with App Store guidelines
-
User Experience:
- Built-in confirmation dialogs
- Customizable messages and buttons
- Smooth transitions and animations
Installation
dependencies:
terminate_restart: ^1.0.10
Quick Start
Get up and running with Terminate Restart in minutes:
- Add Dependency
dependencies:
terminate_restart: ^1.0.10
- Import Package
import 'package:terminate_restart/terminate_restart.dart';
- Initialize the Plugin
void main() {
WidgetsFlutterBinding.ensureInitialized();
TerminateRestart.instance.initialize();
runApp(MyApp());
}
- Basic Usage
// Quick UI refresh
await TerminateRestart.instance.restartApp(
options: const TerminateRestartOptions(
terminate: false,
),
);
// Full app restart
await TerminateRestart.instance.restartApp(
options: const TerminateRestartOptions(
terminate: true,
),
);
// With confirmation dialog
await TerminateRestart.instance.restartAppWithConfirmation(
context,
title: 'Restart App',
message: 'Do you want to restart the app?',
terminate: true,
);
Feature Comparison
Feature | Description |
---|---|
UI Restart | Quick UI refresh without app termination |
Full Restart | Complete app termination and restart |
Data Clearing | Optional storage clearing with keychain preservation |
Confirmation | Optional user confirmation before restart |
iOS Compliance | System-approved methods for App Store compliance |
iOS App Store Compliance
This plugin follows Apple's App Store guidelines regarding app termination:
-
User-Initiated Actions: The plugin only performs termination in response to explicit user actions.
-
Graceful Shutdown: On iOS, the plugin uses approved APIs to ensure graceful app termination:
- Uses
exit(0)
for clean termination - Properly saves state and closes resources
- Follows iOS application lifecycle
- Uses
-
Restart Mechanism: The restart functionality complies with iOS guidelines by:
- Using approved launch mechanisms
- Preserving user preferences when requested
- Maintaining system integrity
-
Data Handling: When clearing data:
- Respects iOS data protection
- Properly handles keychain items
- Maintains necessary system files
Note: While Android allows direct app termination, iOS termination is handled through system-approved methods.
Common Use Cases
-
After Dynamic Updates
// After downloading new assets/code await TerminateRestart.instance.restartAppWithConfirmation( context, title: 'Update Ready', message: 'Restart to apply updates?', terminate: true, );
-
Clearing Cache
// Clear app data but preserve important settings await TerminateRestart.instance.restartApp( options: const TerminateRestartOptions( terminate: true, clearData: true, preserveKeychain: true, preserveUserDefaults: true, ), );
-
Quick UI Refresh
// Refresh UI without full restart await TerminateRestart.instance.restartApp( options: const TerminateRestartOptions( terminate: false, ), );
-
With Confirmation Dialog
// Show confirmation dialog before restart await TerminateRestart.instance.restartAppWithConfirmation( context, title: 'Restart Required', message: 'Do you want to restart the app?', terminate: true, clearData: false, preserveKeychain: true, );
Performance Metrics
Operation | Average Time |
---|---|
UI-only Restart | ~300ms |
Full Termination | ~800ms |
Data Clearing | ~200ms |
With Dialog | +100ms |
Security Considerations
-
Sensitive Data
- Use
preserveKeychain
for credentials - Clear data on logout
- Handle biometric authentication state
- Use
-
State Management
- Clear sensitive data before restart
- Implement proper authentication state handling
- Use secure storage for critical information
-
Platform Security
- Proper permission handling
- Secure data clearing
- Protected file access
Contributing
Contributions are welcome! Please read our contributing guidelines before submitting PRs.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Support
If you have any questions or need help, you can:
- Open an issue
- Check our example for more usage examples
- Read our API documentation
Complete Example
Check out our example app for a full demonstration of all features, including:
- Basic UI/Process restart
- Data clearing with preservation options
- Custom confirmation dialogs
- Error handling
- State management
- Platform-specific features
Demo
Quick Preview
Platform-Specific Details
Android Implementation
The Android implementation uses a combination of techniques to ensure reliable app restart:
// Activity recreation (UI-only restart)
currentActivity.recreate()
// Full process termination
Process.killProcess(Process.myPid())
exitProcess(0)
// Smart Intent handling
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
iOS Implementation
The iOS implementation provides:
- Clean process termination
- State preservation options
- Keychain data handling
- User defaults management
Author
Created by Ahmed Sleem GitHub • pub.dev • LinkedIn
iOS Configuration
For the restart functionality to work properly on iOS, you need to add URL scheme entries to your Info.plist
file:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
</array>
</dict>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
</array>
</dict>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
</array>
<key>CFBundleURLName</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
</dict>
</array>
This configuration allows the plugin to restart your app by opening a URL with your app's bundle identifier.
Configuration Options
Core Parameters
Parameter | Type | Default | Description |
---|---|---|---|
terminate |
bool |
true |
Whether to fully terminate the app process or just restart the UI |
clearData |
bool |
false |
Whether to clear app data during restart |
preserveKeychain |
bool |
false |
Whether to preserve keychain data when clearing app data |
preserveUserDefaults |
bool |
false |
Whether to preserve user defaults when clearing app data |
API Methods
restartApp
Future<bool> restartApp({
required TerminateRestartOptions options,
})
Restarts the app immediately without user confirmation. Returns true
if the restart was successful.
Parameters:
options
: ATerminateRestartOptions
object that configures the restart behavior.
restartAppWithConfirmation
Future<bool> restartAppWithConfirmation(
BuildContext context, {
String title = 'Restart Required',
String message = 'The app needs to restart to apply changes.',
String confirmText = 'Restart Now',
String cancelText = 'Later',
bool clearData = false,
bool preserveKeychain = false,
bool preserveUserDefaults = false,
bool terminate = true,
})
Shows a confirmation dialog before restarting the app. Returns true
if the user confirmed and the restart was successful, or false
if the user canceled.
Parameters:
context
: The BuildContext used to show the dialog.title
: The title of the confirmation dialog.message
: The message shown in the confirmation dialog.confirmText
: The text for the confirm button.cancelText
: The text for the cancel button.clearData
: Whether to clear app data during restart.preserveKeychain
: Whether to preserve keychain data when clearing app data.preserveUserDefaults
: Whether to preserve user defaults when clearing app data.terminate
: Whether to fully terminate the app process or just restart the UI.
Frequently Asked Questions
1. What's the difference between UI-only and Full restart?
- UI-only Restart: Only recreates the UI components while keeping the app process alive. Perfect for theme changes or language switches.
- Full Restart: Completely terminates the app process and starts fresh. Ideal for updates or when you need a clean state.
2. When should I use confirmation dialog?
Use confirmation dialog when:
- User needs to be aware of the restart
- Data might be lost during restart
- Action is user-initiated
- Critical operations are in progress
3. Will my app data be preserved?
- By default, all app data is preserved
- Use
clearData: true
to clear app data - Use
preserveKeychain
andpreserveUserDefaults
to selectively preserve data
4. Is it safe to use in production?
Yes! The plugin:
- Uses official platform APIs
- Follows platform guidelines
- Handles errors gracefully
- Has no special permission requirements
Advanced Use Cases
1. Language Change with Data Preservation
Future<void> changeLanguage(String newLocale) async {
// Save new locale
await prefs.setString('locale', newLocale);
// Restart UI only with confirmation
await TerminateRestart.instance.restartAppWithConfirmation(
context,
title: 'Language Change',
message: 'Restart app to apply new language?',
terminate: false,
preserveUserDefaults: true,
);
}
2. Update Installation with Progress
Future<void> installUpdate() async {
try {
// Download update
await downloadUpdate();
// Apply update with confirmation
final confirmed = await TerminateRestart.instance.restartAppWithConfirmation(
context,
title: 'Update Ready',
message: 'Install update and restart?',
terminate: true,
);
if (!confirmed) {
scheduleUpdateReminder();
}
} catch (e) {
handleUpdateError(e);
}
}
3. Secure Logout with Data Clearing
Future<void> secureLogout() async {
// Clear sensitive data
await TerminateRestart.instance.restartApp(
options: const TerminateRestartOptions(
terminate: true,
clearData: true,
preserveUserDefaults: true, // Keep app settings
preserveKeychain: false, // Clear credentials
),
);
}
How It Works
graph TD
A[Start] --> B{Restart Type}
B -->|UI-only| C[Recreation Mode]
B -->|Full| D[Termination Mode]
C --> E{Show Dialog?}
D --> E
E -->|Yes| F[Show Confirmation]
E -->|No| G[Process Restart]
F -->|Confirmed| G
F -->|Cancelled| H[Cancel Operation]
G --> I{Clear Data?}
I -->|Yes| J[Clear App Data]
I -->|No| K[Preserve Data]
J --> L[Restart App]
K --> L
L --> M[End]
Flow Explanation:
-
Restart Type Selection:
- Choose between UI-only or Full restart
- Each type optimized for specific use cases
-
Confirmation Dialog (Optional):
- Can be added to any restart type
- Fully customizable UI
- User can cancel operation
-
Data Management:
- Optional data clearing
- Selective data preservation
- Secure handling of sensitive data
-
Platform-Specific Implementation:
- Android: Activity/Process management
- iOS: UIApplication handling
- Error handling and recovery